簡體   English   中英

Java - 使用緩沖區通過網絡下載文件

[英]Java - download a file through network with a buffer

我想從網絡流中讀取並直接將字節寫入文件。 但每次我運行程序時,實際上只有很少的字節寫入文件。

Java的:

InputStream in = uc.getInputStream();
int clength=uc.getContentLength();
byte[] barr = new byte[clength];
int offset=0;
int totalwritten=0;
int i;
int wrote=0;

OutputStream out = new FileOutputStream("file.xlsx");
while(in.available()!=0) { 
   wrote=in.read(barr, offset, clength-offset);
   out.write(barr, offset, wrote);
   offset+=wrote;
   totalwritten+=wrote;
}
System.out.println("Written: "+totalwritten+" of "+clength);
out.flush();

那是因為available()沒有按照你的想法做到。 閱讀其API文檔。 您應該直接讀取,直到read()返回的read()字節數為-1。 甚至更簡單,使用Files.copy()

Files.copy(in, new File("file.xlsx").toPath());

使用具有輸入流大小的緩沖區也幾乎違背了使用緩沖區的目的,緩沖區在內存中只有幾個字節。

如果要重新實現copy() ,則一般模式如下:

byte[] buffer = new byte[4096]; // number of bytes in memory
int numberOfBytesRead;
while ((numberOfBytesRead = in.read(buffer)) >= 0) {
    out.write(buffer, 0, numberOfBytesRead);
}

您正在使用.available()錯誤。 Java文檔

available()返回可以從此輸入流中讀取(或跳過)的字節數的估計值,而不會被下一次調用此輸入流的方法阻塞

這意味着你的流第一次比你的文件寫入速度慢(很快就會很快)。

你應該准備一個等待輸入的線程,直到它已經讀取了所有預期的內容長度(當然有一個相當大的超時),或者只是在等待中阻止你的程序,如果用戶交互沒什么大不了的話。

暫無
暫無

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

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