第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

4.3中的Copy方法下為什么要有while?

while(((b=in.read(buf,0,buf.length))!=-1))

{

out.write(buf,0,b);

}

++++++++++++++

能不能像下面這樣》

b=in.read(buf,0,buf.length);

out.write(buf,0,b);

out.flush();//最好加上




正在回答

3 回答

這個while循環(huán)就是為了讀取完要讀取的東西。同時也像你說的為了防止它為空。而且,按照正常情況,buf是字節(jié)數組,應該是1024字節(jié)的倍數吧,有時候一次讀不完,所以用個while循環(huán)來判定。

望采納,謝謝。

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

謎之米

那如果一次文件沒讀完。第二次不就會讀到重復的嗎?或者in.read會自動將未讀的放入buf?
2017-01-16 回復 有任何疑惑可以回復我~
#2

KeT 回復 謎之米

如你所想,底層確實寫好了。你想想如果沒寫好的話,如果照著你之前的思路,不就是會一直重復讀取,死循環(huán)了嘛。
2017-01-19 回復 有任何疑惑可以回復我~
#3

謎之米 回復 KeT

對啊。是實現了 但是我不知道為什么啊 第一次循環(huán)過后不會覆蓋 原理是什么 是read有判斷機制還是什么 ?老師也沒講清楚啊,所以我要問啊。。
2017-01-20 回復 有任何疑惑可以回復我~
#4

壯丹田 提問者

非常感謝!
2017-05-21 回復 有任何疑惑可以回復我~
查看1條回復

這是底層實現代碼,我把主要的注釋寫出來了。自己看著來,不清楚就再探究下。

?public synchronized int read(byte b[], int off, int len)

? ? ? ? throws IOException

? ? {

? ? ? ? getBufIfOpen(); // Check for closed stream

? ? ? ? if ((off | len | (off + len) | (b.length - (off + len))) < 0) {

? ? ? ? ? ? throw new IndexOutOfBoundsException();

? ? ? ? } else if (len == 0) {

? ? ? ? ? ? return 0;

? ? ? ? }


? ? ? ? int n = 0;

? ? ? ? for (;;) {

? ? ? ? ? ? int nread = read1(b, off + n, len - n); ? ?//關鍵,調用read1,達到不重復讀的目的

? ? ? ? ? ? if (nread <= 0)

? ? ? ? ? ? ? ? return (n == 0) ? nread : n;

? ? ? ? ? ? n += nread;

? ? ? ? ? ? if (n >= len)

? ? ? ? ? ? ? ? return n;

? ? ? ? ? ? // if not closed but no bytes available, return

? ? ? ? ? ? InputStream input = in;

? ? ? ? ? ? if (input != null && input.available() <= 0)

? ? ? ? ? ? ? ? return n;

? ? ? ? }

? ? }

private int read1(byte[] b, int off, int len) throws IOException {

? ? ? ? int avail = count - pos;

? ? ? ? if (avail <= 0) {

? ? ? ? ? ? /* If the requested length is at least as large as the buffer, and

? ? ? ? ? ? ? ?if there is no mark/reset activity, do not bother to copy the

? ? ? ? ? ? ? ?bytes into the local buffer. ?In this way buffered streams will

? ? ? ? ? ? ? ?cascade harmlessly. */

? ? ? ? ? ? if (len >= getBufIfOpen().length && markpos < 0) {

? ? ? ? ? ? ? ? return getInIfOpen().read(b, off, len);

? ? ? ? ? ? }

? ? ? ? ? ? fill();

? ? ? ? ? ? avail = count - pos;

? ? ? ? ? ? if (avail <= 0) return -1;

? ? ? ? }

? ? ? ? int cnt = (avail < len) ? avail : len;

? ? ? ? System.arraycopy(getBufIfOpen(), pos, b, off, cnt); ? ? ? ?//讀取范圍,pos變量是關鍵

? ? ? ? pos += cnt; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//關鍵所在,pos變量是成員變量,會被記錄,這也是為什么不會重復讀

? ? ? ? return cnt;

? ? }


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

我的意思是既然out.write(buf,0,b);已經把數據都寫進去了,為什么之前還要有while?

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

壯丹田 提問者

是為了防止srcFile是空的嗎?不是空的,才輸入?
2017-01-09 回復 有任何疑惑可以回復我~
#2

灬諾諾

while是為了避免讀取文件為空或文件太大一次讀取不完
2017-02-26 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

4.3中的Copy方法下為什么要有while?

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

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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