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