Leer bytes de un fichero y guardar en array de bytes

Poseo una clase Leer que lee datos de un fichero por paquete de "n" bytes y los debe guardar en un array de bytes.
El problema es que no consigo obtener resultados.
//Tengo el tamaño total del archivo en bytes
this.Total = this.getOrigen().length(); //Total es de tipo long
//Establezco en el array Destino[] el tamaño total del archivo donde guardar los bytes leidos
this.setDestino(new byte[(int)this.getTotal()]);
//Tengo este Stream para leer del fichero
FileInputStream fis = new FileInputStream(this.getOrigen());
Mi duda es ¿Cómo leo "n" bytes con FileInputStream para guardarlos en el Array Destino?
He probado de todo pero no consigo que funcione.

1 respuesta

Respuesta
1
Si ya tienes el array de bytes es tan sencillo como dirigirte a la posición que quieres leer y obtener como i de unarray cualquiera sea.
O lo de deseas es leer un archivo cualquiera, ¿y convertirlo a un array de bytes independiente del tamaño de bytes que tenga?
Bueno, realmente lo que quiero es:
Tengo ya el array de n bytes.
Lo que quiero es ir leyéndolo de n en n e irlos guardando en un fichero nuevo.
Si el ficherno no existe lo creo.
El problema es que solo me guarda 100 Kb, cuando el array es a lo mejor de 6 Mb.
Eso es lo queno consigo hacer bien, que mientras haya datos en el array de n bytes, me vaya creando el fichero.
Disculpa cuando le comenté de leer fichero a array, era al revés. Leer el array y guardar en fichero.
Si tienes un array de butes que represente un archivo de 6 MB, puedes grabarlo de una sola vez a un archivo, no necesitas hacerlo parte por parte. Con StreamWriter se puede hacer eso la limitante es la memoria RAM del cliente
Hola.
Actualmente lo tengo con un FileOutputStream fos = new FileOutputStream(this.getDestino()); //getDestino es la ruta del fichero creado.
Lo que pasa es que no puedo hacerlo de una sola vez, sino de n en n (lo he llamado múltiplo).
Entonces, tengo un bucle donde compruebo que mientras haya más datos que leer del array, voy escribiendo con esta sentencia:
while (this.getHayMas()){
  if ((this.getProgreso() + this.getMultiplo()) <= this.getTotal()){
     fos.write(this.getOrigen(), (int)this.getProgreso(), (int)this.getMultiplo());
     this.Progreso += this.getMultiplo();
  }else{
     //escribo lo que falte del array al fichero
     fos.write(this.getOrigen(),(int)this.getProgreso(), (int)(this.getTotal()-           
this.getProgreso()));
     //hago que salga del bucle en el main
     this.HayMas=false;
     //Igualo progreso = total
     this.Progreso = this.getTotal();
  }

}
<span style="font-weight: normal;">//getOrigen() = es el array de bytes
</span>
//getProgreso() = es el progreso que llevo copiado. Por cada vuelta del bucle (según entiendo yo) ese progreso va aumentando en funcion al getMultiplo (en mi caso le he puesto de 1024 en 1024.
He revisado el código y entiendo que está bien, pero sin embargo el fichero que me crea, solo me ocupa 100Kb sea cual sea su tamaño original.
¿Qué puede estar ocurriendo? Espero me puedas dar alguna ayuda o idea, porque por más que veo el código no consigo averiguar el fallo.
Gracias y disculpa las molestias que te pueda ocasionar.
Supongo que GetMultiplo y GetProgreso no están actaulizando los datos
Hola.
Gracias por responder.
He estado revisando una y otra vez y ya encontré el fallo.
Resulta que en el BufferedOutputStream hay que pasarle un parámetro TRUE para evitar que sobrescriba el contenido del fichero y que lo nuevo leído lo añada al final.
A partir de ahora ya si me vuelca el array de bytes completo al nuevo fichero (al menos en las propiedades aparece el mismo numero de bytes tanto del fichero leído como el escrito).
Una cosa curiosa es que intento copiar un mp3 o un zip por ejemplo, y el fichero obtenido me da un error diciendo que el formato no es reconocido.
¿Sabes por qué puede pasar esto?
Es posible que tu rutina de copiado esta dejando por fuera bytes y hace que el formato nosea reconocido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas