亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

Java INPUTSTREAM如何實現重復使用

瀏覽:2日期:2022-08-22 17:55:22

引語:

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

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

問題分析:

inputStream的內部有個pos指針,當讀取的時候指針會不斷的移動,當移動到末尾的時候,就無法再次讀取了.

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

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

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

從執行結果可以看出確實inputstream的設計是只能讀取一次.

注意: 這里稍微提一下inputStream.available()這個方法,本地的文件可以直接知道文件的大小,但是如果是網絡中的數據,這個方法最好不要用,因為傳輸的時候不是連續的,數據的大小會讀取不準

問題解決:

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

方法一:

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

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

String text = '測試inputStream內容';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 + '個字節');System.out.println('讀取了' + readCount2 + '個字節');/*** 執行結果是* 讀取了23個字節* 讀取了23個字節*

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

方法二:

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

String text = '測試inputStream內容';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 + '個字節');System.out.println('讀取了' + readCount2 + '個字節');

總結:

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 免费看特级毛片 | 免费一级欧美大片久久网 | 欧美综合成人网 | 国内自拍在线视频高清 | 亚洲在线视频观看 | 2020国产微拍精品一区二区 | 欧美刺激午夜性久久久久久久 | 久草视频观看 | 国产精品推荐 | 国产在线观看精品一区二区三区91 | 中文字幕日韩欧美一区二区三区 | 成人爽爽大片在线观看 | 免费看成人毛片日本久久 | 经典国产乱子伦精品视频 | 亚洲精品国产一区二区在线 | 久久精品国内一区二区三区 | 欧美日韩美女 | 一区二区三区四区免费视频 | 91中文字幕网| 99久久精品国产自免费 | 女人成午夜大片7777在线 | 男人添女人下面免费毛片 | 中日韩美中文字幕 | 波多野结衣在线视频免费观看 | 色综合久久久高清综合久久久 | 国产男女猛烈无遮档免费视频网站 | 久草福利资源在线观看 | 精品三级网站 | 视频一区在线观看 | 国产成人亚洲综合 | 99精品视频在线观看免费播放 | 美国一级毛片在线 | 男女视频免费 | 日本在线看小视频网址 | 久草在线网址 | 免费看日韩欧美一级毛片 | 老人久久www免费人成看片 | 国内欧美一区二区三区 | 美女视频黄a | 全部免费国产潢色一级 | 日本vs欧美一区二区三区 |