2012-05-17 17 views
7

He estado buscando una respuesta a esto, pero no he podido encontrar nada. Hoy temprano, pregunté cómo podía convertir un archivo en una cadena a través de una matriz de bytes y luego otra vez, para recuperarla más tarde.BufferedInputStream en byte [] para enviar a través de un socket a una base de datos

Lo que la gente me decía, era que solo tenía que almacenar la matriz de bytes, para evitar problemas de codificación desagradables. Así que ahora he empezado a trabajar en eso, pero ahora choqué contra una pared.

Básicamente, he usado streams sin búfer antes, para convertir un archivo en una matriz de bytes. Esto funciona bien en teoría, pero ocupa una gran cantidad de memoria que eventualmente arrojará la excepción de tamaño de montón. Debo usar secuencias de almacenamiento en búfer en su lugar (o eso me dicen), y el problema que tengo ahora, va de un BufferedInputStream a un byte []. He tratado de copiar y utilizar los métodos de esta documentación

http://docs.guava-libraries.googlecode.com/git/javadoc/index.html?com/google/common/io/package-summary.html

Donde intercambiar flujos sin búfer para las corrientes búfer. El único problema es que no puedo convertir directamente una secuencia de salida en búfer en una matriz de bytes, como puedo hacerlo con una secuencia sin búfer.

¿Ayuda? :)

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

public final class BufferedByteStream { 

    private static final int BUF_SIZE = 1024000; 

    public static long copy(BufferedInputStream from, BufferedOutputStream to) throws IOException { 
     byte[] buf = new byte[BUF_SIZE]; 
     long total = 0; 
     while(true) { 
      int r = from.read(buf); 
      if(r == -1) { 
       break; 
      } 
      to.write(buf, 0, r); 
      total += r; 
     } 
     return total; 
    } 

    public static byte[] toByteArray(BufferedInputStream in) throws IOException { 
     BufferedOutputStream out = new BufferedOutputStream(new ByteArrayOutputStream()); 
     copy(in, out); 
     return out. // <--- Problem is here 
    } 
} 

EDIT:

todavía estoy recibiendo errores de espacio de almacenamiento dinámico. Así que ahora a publicar todo el código:

main.java

import java.io.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import jserver.io.BufferedByteStream; 
/** 
* 
* @author Vipar 
*/ 
public class main { 
    public static void main(String[] args) { 
    File f = new File("<doesn't matter>"); 
     try { 
      byte[] buf; 
      try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) { 
       buf = BufferedByteStream.toByteArray(bis); 
       bis.close(); 
      } 
      File f2 = new File("<doesn't matter>"); 
      try (FileOutputStream fos = new FileOutputStream(f2)) { 
       fos.write(buf); 
       fos.close(); 
      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

BufferedByteStream.java

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

public final class BufferedByteStream { 

    private static final int BUF_SIZE = 1024000; 

    public static long copy(BufferedInputStream from, BufferedOutputStream to) throws IOException { 
     byte[] buf = new byte[BUF_SIZE]; 
     long total = 0; 
     while(true) { 
      int r = from.read(buf); 
      if(r == -1) { 
       break; 
      } 
      to.write(buf, 0, r); 
      total += r; 
     } 
     return total; 
    } 

    public static byte[] toByteArray(BufferedInputStream in) throws IOException { 
     ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); 
     BufferedOutputStream out = new BufferedOutputStream(bytesOut); 
     copy(in, out); 
     return bytesOut.toByteArray(); 
    } 
} 
+0

¿Por qué no nos dice qué problema está tratando de resolver, en lugar de preguntar qué problema tiene la mitad de la solución? – EJP

+0

Debería haberme dado cuenta originalmente, pero lo haré en una pregunta adecuada en la que simplemente pongo lo que quiero lograr. – OmniOwl

Respuesta

9

Para consultar todas ByteArrayOutputStream: Java 7 API java.io.ByteArrayOutputStream

bytesOut = new ByteArrayOutputStream(); 
byte[] bytes = bytesOut.toByteArray(); 

Actualización: Si insiste en hacer lo que está haciendo usted puede simplemente asignar el ByteArrayOutputStream intermedia a una variable y controlar la matriz de esa manera:

ByteArrayOutputStream bytesOut = new ByteArrayOutputStream() 
BufferedOutputStream out = new BufferedOutputStream(bytesOut); 
copy(in, out); 
return bytesOut.toByteArray(); 

actualización 2: La verdadera pregunta parece siendo la forma de copiar un archivo sin necesidad de leer todo en la memoria en primer lugar:

1) Manualmente:

byte[] buff = new byte[64*1024]; //or some size, can try out different sizes for performance 
    BufferedInputStream in = new BufferedInputStream(new FileInputStream("fromFile")); 
    BufferedOutputStream out = new BufferedOutputStream(new FileoutputStream("toFile")); 
    int n = 0; 
    while ((n = in.read(buff)) >= 0) { 
     out.write(buff, 0, n); 
    } 
    in.close(); 
    out.close(); 

2) de manera eficiente por el sistema operativo y no hay etc bucle:

FileChannel from = new FileInputStream(sourceFile).getChannel(); 
FileChanngel to = new FileOutputStream(destFile).getChannel(); 
to.transferFrom(from, 0, from.size()); 
//or from.transferTo(0, from.size(), to); 
from.close(); 
to.close(); 

3) Si tiene Java 7 puede simplificar la excepción y el cierre continuo o simplemente copiar el archivo con las nuevas API i en java 7:

java.nio.file.Files.copy(...); 

see java.nio.file.Files

+0

Que yo sepa, eso no está almacenado en el búfer ... – OmniOwl

+0

No necesita más almacenamiento en búfer ... Se está construyendo una matriz en la memoria. No se amortigua más que eso. –

+0

Sin embargo, si no me crees (deberías medirte de todos modos), puedes utilizarlo de todos modos, pero asignarlo a su propia variable en el medio. Actualizaré el ejemplo. –

Cuestiones relacionadas