Optimización de Flujos(stream)

Iniciado por ShotgunLogic, 4 Junio 2011, 14:01 PM

0 Miembros y 1 Visitante están viendo este tema.

ShotgunLogic

Hola a todos!

Estoy realizando un proyecto en Java que depende mucho de la velocidad de los flujos de bytes(si, ya se que Java es un lenguaje muy lento, pero es lo que hay :xD).

El caso es que estoy intentando guardar unos archivos, que pueden llegar a tener un tamaño muy grande(segun especifique el usuario). Estos archivos los estoy guardando con un FileOutputStream, mediante un array de bytes, pero este metodo no es muy efectivo debido a que, si tengo que guardar un archivo grande, voy a tener que guardar en memoria un array enorme(imaginaos que sean 4 gigas, como que no) y la memoria cascará. Observé que de todas formas este metodo es más rápido que ir pasando de byte en byte, e intenté simplemente declarar una constante e ir pasando array a array, con un bucle, pero al intentar guardar en el mismo archivo, en vez de guardar en los siguientes bytes lo que hace es machacarla y guardar encima.

¿Alguno tiene alguna solución? O una forma de optimizarlo, he mirado en oracle pero con la cantidad de clases que tiene Java no se yo como ponerlo bien...

Un saludo! ;-)
The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.

Valkyr

No me hagas mucho caso porque la entrada salida de Java no la domino al pelo, pero quizás con el método:

write(byte[] b, int off, int len)
          Writes len bytes from the specified byte array starting at offset off to this file output stream.

puedas hacerlo no? Especificas el offset por el que te quedaste escribiendo anteriormente y sigues escribiendo. De todas formas te vuelvo a decir que no tengo mucha idea de entrada salida, así que si alguien puede contestarte algo mejor bienvenido sea xD.

Saludos.

ShotgunLogic

#2
Cita de: Valkyr en  4 Junio 2011, 16:15 PM
No me hagas mucho caso porque la entrada salida de Java no la domino al pelo, pero quizás con el método:

write(byte[] b, int off, int len)
         Writes len bytes from the specified byte array starting at offset off to this file output stream.

puedas hacerlo no? Especificas el offset por el que te quedaste escribiendo anteriormente y sigues escribiendo. De todas formas te vuelvo a decir que no tengo mucha idea de entrada salida, así que si alguien puede contestarte algo mejor bienvenido sea xD.

Saludos.

Si si, de hecho es el que esoty usando, pero con un array muy grande la memoria casca(logico), pero sin embargo es el método más rápido. Por eso preguntaba cual sería la forma de optimizarlo(yo pretendia hacerlo mientras iba pasando byte[] de un tamaño razonable, pero guardan "encima" del mismo archivo y borran lo que tenía antes).

EDITO: Estoy gilipollas y te he leido mal, si, debe de ser ese metodo para guardar luego(es que ayer iba con algo de prisa y he mirao mal hasta lo de oracle..). De todas formas necesito un tamaño razonable para los bytes[] y no se cual ponerle.

Muchas gracias ^^
The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.

ShotgunLogic

Hago doble post por si a alguien le interesa:

He resuelto el problema con arrays de bytes(byte[]) de 15 mb, que me parece un tamaño razonable, tanto para móviles actuales como para ordenadores(si bien para ordenadores ahora mismo es un cagao). De esta manera van bastante rápidas las cosas pero no se peta la ram.

Un saludo! :laugh:
The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.