Archivo a byte [] en Java
¿ Cómo convierto a java.io.File
en a byte[]
?
Desde JDK 7 puedes usar Files.readAllBytes(Path)
.
Ejemplo:
import java.io.File;
import java.nio.file.Files;
File file;
// ...(file is initialised)...
byte[] fileContent = Files.readAllBytes(file.toPath());
Depende de lo que sea mejor para usted. En cuanto a la productividad, no reinvente la rueda y utilice Apache Commons. Que está aquí FileUtils.readFileToByteArray(File input)
.
Desde JDK 7 - una línea:
byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));
No se necesitan dependencias externas.
import java.io.RandomAccessFile;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);
Documentación para Java 8: http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html
Básicamente hay que leerlo en la memoria. Abra el archivo, asigne la matriz y lea el contenido del archivo en la matriz.
La forma más sencilla es algo similar a esto:
public byte[] read(File file) throws IOException, FileTooBigException {
if (file.length() > MAX_FILE_SIZE) {
throw new FileTooBigException(file);
}
ByteArrayOutputStream ous = null;
InputStream ios = null;
try {
byte[] buffer = new byte[4096];
ous = new ByteArrayOutputStream();
ios = new FileInputStream(file);
int read = 0;
while ((read = ios.read(buffer)) != -1) {
ous.write(buffer, 0, read);
}
}finally {
try {
if (ous != null)
ous.close();
} catch (IOException e) {
}
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return ous.toByteArray();
}
Esto tiene una copia innecesaria del contenido del archivo (en realidad, los datos se copian tres veces: del archivo a buffer
, de buffer
a ByteArrayOutputStream
, de ByteArrayOutputStream
a la matriz resultante real).
También debe asegurarse de leer en la memoria solo archivos de hasta un tamaño determinado (esto suele depender de la aplicación) :-).
También es necesario tratar el IOException
exterior de la función.
Otra forma es esta:
public byte[] read(File file) throws IOException, FileTooBigException {
if (file.length() > MAX_FILE_SIZE) {
throw new FileTooBigException(file);
}
byte[] buffer = new byte[(int) file.length()];
InputStream ios = null;
try {
ios = new FileInputStream(file);
if (ios.read(buffer) == -1) {
throw new IOException(
"EOF reached while trying to read the whole file");
}
} finally {
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return buffer;
}
Esto no tiene copias innecesarias.
FileTooBigException
es una excepción de aplicación personalizada. La MAX_FILE_SIZE
constante son los parámetros de una aplicación.
Para archivos grandes, probablemente debería pensar en un algoritmo de procesamiento de flujo o usar un mapeo de memoria (consulte java.nio
).