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

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

Java 輸入流中的read(byte[] b)方法詳解

瀏覽:2日期:2022-08-18 09:03:24

我就廢話不多說了,大家還是直接看代碼吧~

public int read(byte[] b) throws IOException

從一個輸入流中讀取一定數量的字節,并將這些字節存儲到其緩沖作用的數組b中。這個函數會返回一次性讀取的字節數。

這個函數是一個阻塞式的函數,當它讀到有效數據、確認的文件尾(EOF)或者拋出一個異常時它才會執行其他語句,否則一直停在read()函數處等待。

比如下面的列子:

ServerSocket server = new ServerSocket(port)Socket client = server.accept();BufferedInputStream bis = new BufferedInputStream(client.getInputStream);

byte[] box = new byte[1024];int len = 0;while(-1!=(len = bis.read(box))) { System.out.println(len); String msg = new String(box, 0, len);}語句1;語句二;

在這種情況下,當從客戶端接收了一條信息并轉成msg字符串后,while循環會又回到read()函數,不會跳出循環執行語句一和二。

因為這時read()函數并沒有遇到文件尾或者拋出異常,所以下一次while條件判斷read()函數會一直等待有效數據的輸入,而不是返回-1。此時整個程序將會阻塞在這里。

如果我們是從文件用這個函數以這種while循環方式讀取數據的話并不會遇到這個問題,因為讀到最后會遇到EOF的。

如果用這種方式讀取控制臺的輸入的話,我們可以選擇不要while循環。或者設置條件跳出循環,即如果len小于box的長度話就跳出循環。

我們還可以選擇用DataInputStream的readUTF()函數也可以。還有就是我們可以采用監聽機制,當監聽到輸入流中有數據之后再讀取。

補充:教你完全理解IO流里的 read(),read(byte[]),read(byte[],int off,int len)以及write

好的我們先來講它們的作用,然后再用代碼來實現給大家看

read():

1.從讀取流讀取的是一個一個字節

2.返回的是字節的(0-255)內的字節值

3.讀一個下次就自動到下一個,如果碰到-1說明沒有值了.

read(byte[] bytes)

1.從讀取流讀取一定數量的字節,如果比如文件總共是102個字節

2.我們定義的數組長度是10,那么默認前面10次都是讀取10個長度

3.最后一次不夠十個,那么讀取的是2個

4.這十一次,每次都是放入10個長度的數組.

read(byte[] bytes,int off ,int len)

1.從讀取流讀取一定數量的字節,如果比如文件總共是102個字節

2.我們定義的數組長度是10,但是這里我們寫read(bytes,0,9)那么每次往里面添加的(將只會是9個長度),就要讀12次,最后一次放入3個.

3.所以一般讀取流都不用這個而是用上一個方法:read(byte[]);

下面講解write

write(int i);

直接往流寫入字節形式的(0-255)int值.

write(byte[] bytes);

往流里邊寫入緩沖字節數組中的所有內容,不滿整個數組長度的”空余內容”也會加入,這個下面重點講,

write(byte[] bytes,int off,int len);

1.這個是更嚴謹的寫法,在外部定義len,然后每次len(為的是最后一次的細節長度)都等于流往數組中存放的長度

2.如上述read(bytes),前面每次都放入十個,第十一次放入的是2個,如果用第二種write(bytes),將會寫入輸出流十一次,每次寫入十個長度,造成后面有8個空的,比原來的內容多了

3.所以用write(byte[] bytes,int off,int len);就不會出現多出來的空的情況,因為最后一次len不同

下面是詳細的代碼

public class Test{ public static void main(String[] args) throws Exception { UseTimeTool.getInstance().start(); FileInputStream fis = new FileInputStream('D:1.mp3'); FileOutputStream fos = new FileOutputStream('D:1copy.mp3'); //(PS:一下3個大家分開來寫和測試,為了方便我都列出來了) /*--------------不使用緩沖--------------*/ //如果不緩沖,花了差不多14'秒' int len = -1; while ((len = fis.read()) != -1) { //這里就不是長度的問題了,而是讀取的字節'內容',讀到一個寫一個,相當慢. System.out.println('len : '+ len); fos.write(len); } /*--------------使用緩沖--------------*/ //緩沖方法復制歌曲用了不到20'毫秒' //創建一個長度為1024的字節數組,每次都讀取5kb,目的是緩存,如果不用緩沖區,用fis.read(),就會效率低,一個一個讀字節,緩沖區是一次讀5000個 byte[] bytes = new byte[1024*5]; //每次都是從讀取流中讀取(5k)長度的數據,然后再寫到文件去(5k的)數據,注意,每次讀取read都會不同,是獲取到下一個,直到后面最后一個. while (fis.read(bytes)!=-1) { //write是最追加到文件后面,所以直接每次添5K. fos.write(bytes); } /*--------------解釋len--------------*/ //告訴你為什么用len byte[] bytes = new byte[1024*5]; int len = -1; //解釋這個fis.read(bytes)的意思:從讀取流'讀取數組長度'的數據(打印len可知),并放入數組 while ((len = fis.read(bytes,0,1024)) != -1) { //雖然數組長度的*5,但是這里我們設置了1024所以每次輸出1024 System.out.println('len : '+ len); //因為每次得到的是新的數組,所以每次都是新數組的'0-len' fos.write(bytes,0,len); } fis.close(); fos.close(); UseTimeTool.getInstance().stop(); }}

為了方便大家,也給大家一個統計時間的工具類

class UseTimeTool { private static UseTimeTool utt = new UseTimeTool(); private UseTimeTool() { } public static UseTimeTool getInstance() { return utt; } private long start; public void start() { start = System.currentTimeMillis(); } public void stop() { long end = System.currentTimeMillis(); System.out.println('所用?r? : ' + (end - start) + '毫秒'); }}

好了最后一個:len問題 最后多出數組不滿的部分我特再寫一個出來給大家分析

首先,文本的內容是

Java 輸入流中的read(byte[] b)方法詳解

public class Test{ public static void main(String[] args) throws Exception { UseTimeTool.getInstance().start(); FileInputStream fis = new FileInputStream('D:a.txt'); FileOutputStream fos = new FileOutputStream('D:acopy.txt');

不使用len:

byte[] bytes = new byte[1024*5]; while (fis.read(bytes)!=-1) { fos.write(bytes); }

得到的效果:

Java 輸入流中的read(byte[] b)方法詳解

發現后續后很多的空部分,所以說不嚴謹

使用len:

byte[] bytes = new byte[1024*5]; int len = -1; while ((len = fis.read(bytes,0,1024)) != -1) { fos.write(bytes,0,len); }

得到的效果

Java 輸入流中的read(byte[] b)方法詳解

和原來一模一樣,講了那么多就是希望能幫助大家真正的理解。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Java
相關文章:
主站蜘蛛池模板: 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 陶瓷加热器,履带式加热器-吴江市兴达电热设备厂 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 脉冲除尘器,除尘器厂家-淄博机械 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 伺服电机_直流伺服_交流伺服_DD马达_拓达官方网站 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 数码管_LED贴片灯_LED数码管厂家-无锡市冠卓电子科技有限公司 | 深圳法律咨询【24小时在线】深圳律师咨询免费 |