亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

bytes = in.read(buf,0,buf.length))!=-1 什么意思

while (bytes = in.read(buf,0,buf.length))!=-1) 這個是什么機制的循環 我怎么沒看懂 而且bytes的數目還能等于-1 要是能等于-1的話 那第一種代碼 不就是錯的么?


正在回答

5 回答

我感覺樓上說的有問題,int bs = read(buf,0,buf.length)運行的時候會返回讀入緩沖區的字節總數,但是(注意),如果已經到了文件末尾則返回-1,意思就是說,舉個樓上一樣的例子,我有個1024字節大小的字節數組,要讀取一個1500字節大小的數據,首先第一次bs的值等于1024,不等于-1,進入循環打印輸出,第二次bs的值等于476,不等于-1,進入循環打印輸出,第三次bs的值等于-1,跳出循環,最終是可以打印輸出1500數據的全部內容的,在這過程中可以發現有個類似指針的作用,read方法它會一個一個字節輪流讀取數據(這是我的理解,僅供參考,如果有理解的錯誤的地方,也請大神們幫忙指出哈)

1 回復 有任何疑惑可以回復我~
#1

慕瓜7073846

為什么第二次bs的值會是476,第三次會是-1呢?
2018-04-11 回復 有任何疑惑可以回復我~

看了樓主的自問自答,搞懂了。

0 回復 有任何疑惑可以回復我~
#1

昵稱是JaVa

搞錯了,是 @charsandrew的自問自答。感謝。
2017-01-14 回復 有任何疑惑可以回復我~

還在嗎?

0 回復 有任何疑惑可以回復我~

我明白了,但是是通過自己寫代碼試驗+看read()方法的原代碼,明白的。我上面說的情況確實不會發生。

如果你有興趣,我講給你一下。

1 回復 有任何疑惑可以回復我~

如果你的bytes是定義的數組的話,這段代碼就是錯誤的。in.read()方法是有返回值的,返回值就是你讀取了多少個字節。最多可以讀取你定義的buf數組大小的字節,如果沒有讀完會自動再往下讀取buf大小的字節。但是如果讀到一半讀完了,相當于你的buf數組其實是沒有放滿的,那你知道實際讀取了多少字節嗎?所有才有了返回值就是bytes這個值,如果最后這個值讀出來=-1不就是讀完了嗎??

0 回復 有任何疑惑可以回復我~
#1

charsandrew

如果我第一次數據讀入數組沒讀完,第二次半途讀完了,那第二次讀取的內容雖然寫入了數組,但由于返回值是-1,那么是不滿足循環條件的啊,也就是說后面老師打印輸出,并沒有完全將數據內容全部打印出來。是這樣嗎?
2016-07-19 回復 有任何疑惑可以回復我~
#2

慕粉慕名而來 回復 charsandrew

你到底有沒有聽老師在講課啊,老師還給你注釋的,我把注釋貼上來你再看一遍,從in中批量讀取字節,放入到buf這個字節數組中,從0位置開始放,最多放buf.length。返回的是讀到字節的個數。而read方法是一個字節一個字節讀取的
2016-07-19 回復 有任何疑惑可以回復我~
#3

charsandrew 回復 慕粉慕名而來

這個問題,我搞明白了。 我之前的疑問是:比如我要讀取一個1500字節的文件,并把它輸出到控制臺,我定義一個1024字節數組來緩存讀取,第一次讀1024個字節,返回的是1024;然后將1024字節輸出到控制臺。然后循環讀取,再讀剩下的476個字節,因為讀完了,返回的是-1,雖然將476個字節讀進了數組,但不滿足while的執行條件,所以剩下的476個字節是不會輸出到控制臺的。
2016-07-19 回復 有任何疑惑可以回復我~
#4

charsandrew 回復 慕粉慕名而來

然后我寫代碼去試驗了一下,結果是全部都能輸出到控制臺。然后我就去看read()的源代碼了,發現api中的解釋有點誤導人。實際上讀到,在返回-1之前,是先返回476的,然后再次循環讀取,返回-1??聪略创a一切都明白了,哈哈
2016-07-19 回復 有任何疑惑可以回復我~
#5

qq_析木_0 回復 charsandrew

請問是不是因為read方法是一個字節一個字節的讀的,后面476個字節也依次輸出了,再往后讀第477個字節時,因為返回-1,所以退出循環?
2017-03-04 回復 有任何疑惑可以回復我~
#6

MartinCode

我有些不太懂, in.read(buf,0,buf.length)雖然第一次沒讀完返回的是字節數,第二次再讀是繼續往下讀,但是他定義了buf,0,buf.length,應該再從第一個位置讀吧???
2017-03-23 回復 有任何疑惑可以回復我~
#7

慕瓜7073846 回復 charsandrew

為什么讀完了會返回-1呢
2018-04-11 回復 有任何疑惑可以回復我~
查看4條回復

舉報

0/150
提交
取消

bytes = in.read(buf,0,buf.length))!=-1 什么意思

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號