亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java INPUTSTREAM如何實現(xiàn)重復(fù)使用

 更新時間:2020年10月12日 11:34:15   作者:我想問問天  
這篇文章主要介紹了Java INPUTSTREAM如何實現(xiàn)重復(fù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

引語:

之前做項目的時候遇到一個問題,就是從網(wǎng)絡(luò)中讀取的圖片要上傳到oss,而且要對圖片進(jìn)行裁剪和壓縮,其中上傳和裁剪都要使用到圖片的inputStream,

又因為inputstream不能重復(fù)讀,導(dǎo)致裁剪是成功的,而上傳是失敗的.我們今天就提供兩種方法來解決,inputStream不能重復(fù)讀的問題.

問題分析:

inputStream的內(nèi)部有個pos指針,當(dāng)讀取的時候指針會不斷的移動,當(dāng)移動到末尾的時候,就無法再次讀取了.

我們寫個簡單的例子來看下:

String text = "測試inputStream內(nèi)容";
InputStream inputStream = new ByteArrayInputStream(text.getBytes());
byte[] readArray = new byte[inputStream.available()];
int readCount1 = inputStream.read(readArray);
System.out.println("讀取了" + readCount1 + "個字節(jié)");

byte[] readArray2 = new byte[inputStream.available()];
int readCount2 = inputStream.read(readArray2);
System.out.println("讀取了" + readCount2 + "個字節(jié)");
/**
* 執(zhí)行結(jié)果是
* 讀取了23個字節(jié)
* 讀取了-1個字節(jié)
*/

從執(zhí)行結(jié)果可以看出確實inputstream的設(shè)計是只能讀取一次.

注意: 這里稍微提一下inputStream.available()這個方法,本地的文件可以直接知道文件的大小,但是如果是網(wǎng)絡(luò)中的數(shù)據(jù),這個方法最好不要用,因為傳輸?shù)臅r候不是連續(xù)的,數(shù)據(jù)的大小會讀取不準(zhǔn)

問題解決:

那么我們實際項目中應(yīng)該怎么解決呢?總不能就真的只使用一次inputSteam吧.我們來看解決方法:

方法一:

使用ByteArrayOutputStream來緩存字節(jié),然后每次讀取從緩存的ByteArrayOutputStream中拿取.

很自然的想到把inputStream的緩存起來(當(dāng)然不一定說是要放在ByteArrayOutputStream,其他的方式也可以,都是緩存起來的思路,實現(xiàn)方式有很多種,這種比較方便)

String text = "測試inputStream內(nèi)容";
InputStream rawInputStream = new ByteArrayInputStream(text.getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = rawInputStream.read(buffer)) > -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
InputStream in1 = new ByteArrayInputStream(outputStream.toByteArray());
InputStream in2 = new ByteArrayInputStream(outputStream.toByteArray());
int readCount1 = in1.read(buffer);
int readCount2 = in2.read(buffer);
System.out.println("讀取了" + readCount1 + "個字節(jié)");
System.out.println("讀取了" + readCount2 + "個字節(jié)");
/**
* 執(zhí)行結(jié)果是
* 讀取了23個字節(jié)
* 讀取了23個字節(jié)
*

這里是先將inputStream的數(shù)據(jù)讀取到output中,然后要反復(fù)使用inputStream中的內(nèi)容的時候,我們將output中的數(shù)據(jù)取出(很神奇的設(shè)定,output可以反復(fù)取,input只能讀一次)

方法二:

其實inputStream中有操作指針的方法,mark和reset,聽名字就知道是標(biāo)記和重置.在使用inputSteam前我們標(biāo)記下inputStream指針的位置,讀取完之后,重置,然后就可以反復(fù)使用了.我們看代碼:

String text = "測試inputStream內(nèi)容";
InputStream rawInputStream = new ByteArrayInputStream(text.getBytes());
byte[] readArray = new byte[1024];
rawInputStream.mark(0);
int readCount1 = rawInputStream.read(readArray);
rawInputStream.reset();
int readCount2 = rawInputStream.read(readArray);
System.out.println("讀取了" + readCount1 + "個字節(jié)");
System.out.println("讀取了" + readCount2 + "個字節(jié)");

總結(jié):

1.inputStream只能讀取一次,也就是說只能調(diào)用read()或者其他的帶參數(shù)的read()方法一次,在下次調(diào)用讀取出來是-1,做項目的時候不要忘記這一點了,可能會導(dǎo)致有些坑出現(xiàn);

2.可以使用緩存或者mark/reset方法來重復(fù)使用inputStream,這里要注意的是如果inputStream如果內(nèi)容很多,緩存不是一個好辦法,因為在使用完之前會占用大量的內(nèi)存(我遇到過這樣的,上傳很多圖片然后還有緩存,導(dǎo)致內(nèi)存不夠就一直fullGC,然后cpu先爆了);

3.還有一個小點就是別忘了關(guān)閉使用完的inputStream/outputSteam.

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)

    Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)

    這篇文章主要給大家介紹了關(guān)于Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類,這些類可以幫助我們更方便地實現(xiàn)多線程編程,需要的朋友可以參考下
    2024-02-02
  • Java零基礎(chǔ)也看得懂的單例模式與final及抽象類和接口詳解

    Java零基礎(chǔ)也看得懂的單例模式與final及抽象類和接口詳解

    本文主要講了單例模式中的餓漢式和懶漢式的區(qū)別,final的使用,抽象類的介紹以及接口的具體內(nèi)容,感興趣的朋友來看看吧
    2022-05-05
  • Java函數(shù)式編程(十一):遍歷目錄

    Java函數(shù)式編程(十一):遍歷目錄

    這篇文章主要介紹了Java函數(shù)式編程(十一):遍歷目錄,本文是系列文章的第11篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • Java程序啟動時初始化數(shù)據(jù)的四種方式

    Java程序啟動時初始化數(shù)據(jù)的四種方式

    本文主要介紹了Java程序啟動時初始化數(shù)據(jù)的四種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Spring Aop注解實現(xiàn)

    Spring Aop注解實現(xiàn)

    本文我們通過Spring AOP和Java的自定義注解來實現(xiàn)日志的插入功能,非常不錯,具有一定的參考借鑒價值,需要的朋友一起看看吧,希望對你有所幫助
    2021-07-07
  • Java代碼重構(gòu)的幾種模式詳解

    Java代碼重構(gòu)的幾種模式詳解

    這篇文章詳細(xì)介紹了Java代碼重構(gòu)的幾種模式,有需要的朋友可以參考一下
    2013-10-10
  • uploadify上傳及后臺文件合法性驗證的代碼解析

    uploadify上傳及后臺文件合法性驗證的代碼解析

    這篇文章主要介紹了uploadify上傳及后臺文件合法性驗證的代碼解析,整段代碼分為后臺上傳方法,文件合法性驗證類,前端上傳js,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • Java如何向Word模板中插入Base64圖片和數(shù)據(jù)信息

    Java如何向Word模板中插入Base64圖片和數(shù)據(jù)信息

    這篇文章主要介紹了Java如何向Word模板中插入Base64圖片和數(shù)據(jù)信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • MyBatis通用Mapper和PageHelper的過程詳解

    MyBatis通用Mapper和PageHelper的過程詳解

    這篇文章主要介紹了MyBatis通用Mapper和PageHelper的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 詳解Spring不同數(shù)據(jù)庫異常如何抽象的

    詳解Spring不同數(shù)據(jù)庫異常如何抽象的

    根據(jù)spring-jdbc中的定義,所有的數(shù)據(jù)操作異常都會轉(zhuǎn)換為 DataAccessException,下面這篇文章主要給大家介紹了關(guān)于Spring不同數(shù)據(jù)庫異常如何抽象的相關(guān)資料,需要的朋友可以參考下
    2021-09-09

最新評論