2012-02-24 36 views
5

Estoy intentando leer y escribir archivos de gran tamaño (más de 100 MB) usando BufferedInputStream & BufferedOutputStream. Obtengo el problema de Heap Memory & excepción de OOM.
El código es el siguiente:Escribiendo archivos de gran tamaño usando 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();   

Mi pregunta es cuando usamos el BufferedOutputStreeam es que la celebración de la memoria hasta que el archivo completo se escribe?
¿Cuál es la mejor manera de escribir archivos grandes usando BufferedOutputStream?

+0

intente vaciar dentro del circuito –

+0

está almacenado en el buffer hasta que lo lave. enjuague en el ciclo while. –

+2

@jcomeau_ictx - no, BufferedOutputStream no se almacena en búfer hasta que lo vacía, sino que tiene un tamaño de búfer interno fijo. – jtahlborn

Respuesta

5

no hay nada de malo con el código que ha proporcionado. sus problemas de memoria deben estar en otra parte. los flujos almacenados tienen un límite fijo de uso de memoria.

la manera más fácil de determinar qué ha causado un OOME, por supuesto, es hacer que el OOME genere un volcado de pila y luego examinar ese volcado de pila en un generador de perfiles de memoria.

+0

Esto es correcto. Pero, hay un problema con el código, buffOut.write() podría escribir menos bytes de los que le pedirá que escriba, en cuyo caso, deberá continuar escribiendo hasta que haya escrito todos los bytes disponibles. – Bill

+1

@Bill - no, eso no es verdad. 'write()' siempre escribe todos los bytes (no tiene valor de retorno). – jtahlborn

+0

¿Está ejecutando este código en muchos hilos a la vez? Es bastante difícil ver que esta es la fuente de su error de falta de memoria. –

Cuestiones relacionadas