2011-10-11 79 views
2

下面的代碼不起作用下載文件下載(順便說一句CLEN是文件的長度):與BufferInputStream工作不正常

int pos = 0, total_pos = 0; 
    byte[] buffer = new byte[BUFFER_SIZE]; 
      while (pos != -1) { 
       pos = in.read(buffer, 0, BUFFER_SIZE); 
       total_pos += pos; 
       out.write(buffer); 
       setProgress((int) (total_pos * 100/clen)); 
      } 

...但是這工作得很好:

int buf; 
    while ((buf = in.read()) != -1) 
     out.write(buf); 

我想知道爲什麼,即使第二個代碼段快速運行。關於這一點,有沒有什麼特別的理由使用一個byte []緩衝區(因爲它似乎並沒有更快,已經BufferedInputStream爲使用它自己的緩衝....?)

回答

2

這是它應該做完了。

public static void copyStream(InputStream is, OutputStream os) 
    { 
     byte[] buff = new byte[4096]; 
     int count; 
     try { 
      while((count = is.read(buff)) > 0) 
       os.write(buff, 0, count); 

     }catch (Exception e) { 
      e.printStackTrace(); 
     }finally { 
      try { 
       if(is != null) 
        is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       if(os != null) 
        os.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
+0

謝謝st0le我看到我的錯誤是在'out.write(緩衝)'(和pimaster。);那是寫'buffer'的字節的_all_而不是隻讀那些在每個緩衝區讀取的字節。問題解決了!感謝) –

0

我試着對代碼進行必要的最小更改以使其工作。 st0le在提供流式複製的整潔版本方面做得很好。

public class Test { 
    private static final String FORMAT = "UTF-8"; 
    private static final int BUFFER_SIZE = 10; // for demonstration purposes. 
    public static void main(String[] args) throws Exception { 
     String string = "This is a test of the public broadcast system"; 
     int clen = string.length(); 
     ByteArrayInputStream in = new ByteArrayInputStream(string.getBytes(FORMAT)); 
     OutputStream out = System.out; 
     int pos = 0, total_pos = 0; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     while (pos != -1) { 
      pos = in.read(buffer, 0, BUFFER_SIZE); 
      if (pos > 0) { 
       total_pos += pos; 
       out.write(buffer, 0, pos); 
       setProgress((int) (total_pos * 100/clen)); 
      } 
     } 
    } 
    private static void setProgress(int i) { 
    } 
} 
  • 你被忽略的POS值當你寫出的緩衝輸出流。
  • 您還需要重新檢查的POS的價值,因爲它可能只是讀取文件的末尾。在這種情況下,您不會增加total_pos(儘管您應該報告您已完成100%)
  • 請確保使用close()在適當的位置正確處理您的資源。

CNC中 用於使用陣列作爲緩衝器的一般原因是,使得輸出流可以,因爲它可以用較大的數據集一樣多的工作。

寫入控制檯可能不會有太大的延遲,但它可能是一個網絡套接字進行寫入或其他一些慢速設備。由於JavaDoc狀態

OutputStream的write方法在每個要寫出的字節上調用一個參數的write方法。鼓勵子類覆蓋此方法並提供更高效的實現。

使用緩衝輸入/輸出流時使用它的好處可能是最小的。

+0

'而((POS = in.read(緩衝液))> 0)'確實所有的東西更乾淨。 – EJP

+0

同意,但問題是圍繞着爲什麼他的代碼沒有工作重點。所以我的首要任務就是解決他的代碼出了什麼問題。在這些情況下,我們有責任提供重新考慮建議?我會考慮回答未來的問題。 – pimaster

+0

沒問題,只是一個評論。 – EJP