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
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();
}
}
¿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
Debería haberme dado cuenta originalmente, pero lo haré en una pregunta adecuada en la que simplemente pongo lo que quiero lograr. – OmniOwl