簡體   English   中英

如何確定BufferedOutputStream的write方法的緩沖區大小

[英]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

如果我進一步增加緩沖區大小,則所花費的時間會增加,也可以忽略不計。 所以我的問題是,

  1. 為什么文件大小會改變?
  2. 這種尺寸變化會導致任何微妙的后果嗎?
  3. 完成此功能的最佳方法是什么(復制文件)?

我不知道下面會發生什么? 謝謝你的任何建議。 編輯:我有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);
}

參考文獻:

  1. 為什么文件大小會改變?
你忘了`flush()`(和`close()`):bufferedOutputStream.flush()

您還應該將讀取的字節數傳遞給write方法:

bufferedOutputStream.write(data, 0, bytesRead);
  1. 完成此功能的最佳方法是什么(復制文件)?

兩者都來自 IO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM