Archivo a byte [] en Java

Resuelto Ben Noland asked hace 15 años • 26 respuestas

¿ Cómo convierto a java.io.Fileen a byte[]?

Ben Noland avatar May 13 '09 23:05 Ben Noland
Aceptado

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());
Michael Pollmeier avatar Feb 22 '2011 20:02 Michael Pollmeier

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).

svachon avatar May 13 '2009 16:05 svachon

Desde JDK 7 - una línea:

byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));

No se necesitan dependencias externas.

Paulius Matulionis avatar Jul 02 '2015 13:07 Paulius Matulionis
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

Dmitry Mitskevich avatar Dec 08 '2011 13:12 Dmitry Mitskevich

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 buffera ByteArrayOutputStream, de ByteArrayOutputStreama 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 IOExceptionexterior 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.

FileTooBigExceptiones una excepción de aplicación personalizada. La MAX_FILE_SIZEconstante 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).

Mihai Toader avatar May 13 '2009 17:05 Mihai Toader