2011-10-11 110 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