电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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
相關文章:
主站蜘蛛池模板: 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 技德应用| 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 瓶盖扭矩仪(扭力值检测)-百科 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀| 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 免联考国际MBA_在职MBA报考条件/科目/排名-MBA信息网 | 实验室装修_实验室设计_实验室规划设计- 上海广建净化工程公司 | 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 合同书格式和范文_合同书样本模板_电子版合同,找范文吧 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 |