935 Stimmen

Datei zu byte[] in Java

Wie konvertiere ich eine java.io.File zu einer byte[] ?

0 Stimmen

Eine Anwendung, die ich mir vorstellen kann, ist das Lesen von serialisierten Objekten aus einer Datei.

2 Stimmen

Eine andere Möglichkeit besteht darin, den Dateityp anhand der Kopfzeile zu ermitteln.

0 Stimmen

Try This byte[] bytes = null; BufferedInputStream fileInputStream = null; try{File file = new File(filePath); fileInputStream = new BufferedInputStream(new FileInputStream(file)); //fileInputStream = Thread. currentThread().getContextClassLoader().getResourceAsStream(this.filePath); bytes = new byte[(int) file.length()]; fileInputStream.read(bytes); } catch(FileNotFoundException ex){ throw ex; }

79voto

Tom Punkte 41522

Wie jemand sagte, Apache Commons File Utils könnte das haben, wonach Sie suchen

public static byte[] readFileToByteArray(File file) throws IOException

Beispiel für die Verwendung ( Program.java ):

import org.apache.commons.io.FileUtils;
public class Program {
    public static void main(String[] args) throws IOException {
        File file = new File(args[0]);  // assume args[0] is the path to file
        byte[] data = FileUtils.readFileToByteArray(file);
        ...
    }
}

28voto

Jeffrey Blattman Punkte 21673

Wenn Sie kein Java 8 haben und mit mir übereinstimmen, dass es eine schlechte Idee ist, eine umfangreiche Bibliothek einzubinden, um das Schreiben von ein paar Zeilen Code zu vermeiden:

public static byte[] readBytes(InputStream inputStream) throws IOException {
    byte[] b = new byte[1024];
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    int c;
    while ((c = inputStream.read(b)) != -1) {
        os.write(b, 0, c);
    }
    return os.toByteArray();
}

Der Aufrufer ist für das Schließen des Streams verantwortlich.

0 Stimmen

Ich danke Ihnen. Das ist, was ich brauche

26voto

Cuga Punkte 17251
// Returns the contents of the file in a byte array.
    public static byte[] getBytesFromFile(File file) throws IOException {        
        // Get the size of the file
        long length = file.length();

        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large
            throw new IOException("File is too large!");
        }

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;

        InputStream is = new FileInputStream(file);
        try {
            while (offset < bytes.length
                   && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
        } finally {
            is.close();
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }
        return bytes;
    }

0 Stimmen

Fügen Sie außerdem numRead in die Schleife ein. Deklarieren Sie Variablen in dem kleinstmöglichen gültigen Bereich. Die Platzierung außerhalb der while-Schleife ist nur notwendig, um den komplizierten "while"-Test zu ermöglichen; es wäre besser, den Test auf EOF innerhalb der Schleife durchzuführen (und eine EOFException zu werfen, wenn er auftritt).

0 Stimmen

throw new IOException("File is too large!"); Was soll man tun, wenn die Datei zu groß ist? Gibt es auch ein Beispiel dafür?

25voto

Amit Punkte 795

Sie können dazu auch die NIO-Api verwenden. Ich könnte dies mit diesem Code tun, solange die gesamte Dateigröße (in Bytes) in einem int passen würde.

File f = new File("c:\\wscp.script");
FileInputStream fin = null;
FileChannel ch = null;
try {
    fin = new FileInputStream(f);
    ch = fin.getChannel();
    int size = (int) ch.size();
    MappedByteBuffer buf = ch.map(MapMode.READ_ONLY, 0, size);
    byte[] bytes = new byte[size];
    buf.get(bytes);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        if (fin != null) {
            fin.close();
        }
        if (ch != null) {
            ch.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Ich denke, seine sehr schnell, da seine mit MappedByteBuffer.

2 Stimmen

Es gibt absolut keinen Grund, Memory Mapping zu verwenden, wenn Sie die Datei nur einmal lesen wollen, und es wird am Ende doppelt so viel Speicher wie bei der Verwendung eines normalen FileInputStream benötigt.

1 Stimmen

Leider wird der MappedByteBuffer nicht automatisch freigegeben.

2 Stimmen

Fantastisch, das neue Beispiel enthält printStackTrace, die klassische fehlerhafte Ausnahmebehandlung.

24voto

Sudip Bhandari Punkte 1877

Das geht ganz einfach:

File fff = new File("/path/to/file");
FileInputStream fileInputStream = new FileInputStream(fff);

// int byteLength = fff.length(); 

// In android the result of file.length() is long
long byteLength = fff.length(); // byte count of the file-content

byte[] filecontent = new byte[(int) byteLength];
fileInputStream.read(filecontent, 0, (int) byteLength);

0 Stimmen

Es gibt einfachere Methoden, wie die bereits erwähnten Einzeiler.

1 Stimmen

@Sapphire_Brick Einfachere Wege ja - aber die Einzeiler passen nicht zu allen Situationen. Wie zum Beispiel Android.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X