2012-02-24 56 views
5

我正在尝试使用BufferedInputStream & BufferedOutputStream读取和写入大文件(大于100 MB)。我得到堆内存问题& OOM异常。
代码如下:使用BufferedOutputStream写入大文件

BufferedInputStream buffIn = new BufferedInputStream(iStream); 
/** iStream is the InputStream object **/ 

BufferedOutputStream buffOut=new BufferedOutputStream(new FileOutputStream(file)); 
byte []arr = new byte [1024 * 1024]; 
int available = -1; 
while((available = buffIn.read(arr)) > 0) { 
    buffOut.write(arr, 0, available); 
}  
buffOut.flush(); 
buffOut.close();   

我的问题是,当我们使用BufferedOutputStreeam是它收容了存储,直到整个文件被写入了呢?
使用BufferedOutputStream编写大文件的最佳方法是什么?

+0

尝试在循环内部冲洗 – 2012-02-24 04:23:53

+0

它缓冲,直到你刷新它。在while循环中刷新它。 – 2012-02-24 04:24:32

+2

@jcomeau_ictx - no,BufferedOutputStream在刷新之前不会缓冲,它有一个固定的内部缓冲区大小。喝酒时不应张贴 – jtahlborn 2012-02-24 04:46:18

回答

5

您提供的代码没有任何问题。你的记忆问题必须在别处。缓冲流具有固定的内存使用限制。

确定导致OOME的最简单方法当然是让OOME生成一个堆转储,然后检查内存分析器中的堆转储。

+0

这是正确的。但是,代码存在问题,buffOut.write()写入的字节数可能会少于写入的字节数,在这种情况下,您需要继续写入,直到写入所有可用字节。 – Bill 2012-02-24 04:47:36

+1

@Bill - 不,那是不正确的。 write()总是写所有的字节(它没有返回值)。 – jtahlborn 2012-02-24 05:07:21

+0

你是否在多个线程中同时运行此代码?很难看到这是你的内存不足错误的根源。 – 2012-02-24 06:34:57