[英]How to determine the buffer size for BufferedOutputStream's write method
我正在嘗試使用以下代碼復制文件:
1:
int data=0;
byte[] buffer = new byte[4096];
while((data = bufferedInputStream.read())!=-1){
bufferedOutputStream.write(data);
}
2:
byte[] buffer = new byte[4096];
while(bufferedInputStream.read(buffer)!=-1){
bufferedOutputStream.write(buffer);
}
文件的實際大小為3892028字節(在Windows上)。 該文件將由用戶thro struts2 fileupload上傳。 上傳的文件大小與Windows完全相同。 當我嘗試從臨時文件夾復制上傳的文件時,復制的文件大小不一,所用時間也各不相同(可忽略不計)。 請查看以下讀物。
Without using buffer(Code 1)
Time taken 77
3892028
3891200
Buffer size 1024(Code 2)
Time taken 17
3892028
3891200
Buffer size 4096(Code 2)
Time taken 18
3892028
3891200
Buffer size 10240(Code 2)
Time taken 14
3892028
3901440
Buffer size 102400(Code 2)
Time taken 9
3892028
3993600
如果我進一步增加緩沖區大小,則所花費的時間會增加,也可以忽略不計。 所以我的問題是,
我不知道下面會發生什么? 謝謝你的任何建議。 編輯:我有flush()和close()方法調用。 注意:我修剪了我的代碼以使其更簡單。
問題是, BufferedInputStream.read(byte[])
盡可能多地讀入緩沖區。 因此,如果流只包含1個字節,則只填充字節數組的第一個字節。 但是, BufferedInputStream.write(byte[])
將所有給定的字節寫入流中,這意味着它仍將寫入完整的4096個字節,包含當前迭代的1個字節和前一次迭代的4095個剩余字節。
您需要做的是保存讀取的字節數,然后寫入相同的數量。
例:
int lastReadCnt = 0;
byte[] buffer = new byte[4096];
while((lastReadCnt = bufferedInputStream.read(buffer))!=-1){
bufferedOutputStream.write(buffer, 0, lastReadCnt);
}
參考文獻:
- 為什么文件大小會改變?
您還應該將讀取的字節數傳遞給write
方法:
bufferedOutputStream.write(data, 0, bytesRead);
- 完成此功能的最佳方法是什么(復制文件)?
兩者都來自apache-commons IO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.