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; }

1510voto

Alan Punkte 2707

Desde JDK 7 können Sie Files.readAllBytes(Path) .

Ejemplo:

import java.io.File;
import java.nio.file.Files;

File file;
// ...(file is initialised)...
byte[] fileContent = Files.readAllBytes(file.toPath());

85 Stimmen

@aldo.roman.nurena Mit JDK7 wurde eine Methode File.toPath() eingeführt, die ein Path-Objekt liefert.

10 Stimmen

Sie können einen Pfad aus einer Datei abrufen. Versuchen Sie es: File file = new File("/path"); Path path = Paths.get(file.getAbsolutePath()); byte[] data = Files.readAllBytes(path);

0 Stimmen

Funktioniert nur unter JRE 1.7, was Android KitKat erfordert

581voto

svachon Punkte 7526

Es kommt darauf an, was für Sie das Beste ist. Wenn Sie produktiv sein wollen, sollten Sie das Rad nicht neu erfinden und Apache Commons verwenden. Das ist hier FileUtils.readFileToByteArray(File input) .

37 Stimmen

@ymajoros: So wahr! Ich habe lieber ein paar zusätzliche Codezeilen als noch eine weitere Abhängigkeit. Abhängigkeiten haben versteckte Kosten. Sie müssen mit dieser Bibliothek auf dem Laufenden bleiben, die Abhängigkeit in Ihr Build-Skripting einbinden usw., sie den Leuten mitteilen, die Ihren Code verwenden usw. usw. Wenn Sie bereits eine Bibliothek verwenden, die Code dafür hat, dann verwenden Sie diese, andernfalls würde ich sagen, schreiben Sie es selbst.

12 Stimmen

Dies beantwortet die Frage, wie man eine Datei liest, aber nicht die Frage, wie man ein Objekt vom Typ java.IO.File in byte[] umwandelt.

6 Stimmen

Wie wird dies zum Lesen einer File a byte[] ? Ich benutze Java6, also kann ich die NIO-Methoden nicht verwenden :(

324voto

Paulius Matulionis Punkte 22417

Seit JDK 7 - ein Einzeiler:

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

Keine externen Abhängigkeiten erforderlich.

22 Stimmen

Dies ist nun eine bessere Wahl als die akzeptierte Antwort, die Apache Commons erfordert.

1 Stimmen

Danke :) Ich brauchte auch das hier: String text = new String(Files.readAllBytes(new File("/path/to/file").toPath())); das ist ursprünglich von stackoverflow.com/a/26888713/1257959

9 Stimmen

Unter Android muss mindestens die API-Stufe 26 erreicht werden.

172voto

Dmitry Mitskevich Punkte 4558
import java.io.RandomAccessFile;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);

Dokumentation für Java 8: http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html

2 Stimmen

Sie müssen den Rückgabewert von f.read() überprüfen. Hier kann es manchmal vorkommen, dass Sie nicht die ganze Datei lesen können.

8 Stimmen

Eine solche Situation kann nur auftreten, wenn sich die Datei während des Lesens ändert. In allen anderen Fällen wird eine IOException ausgelöst. Um dieses Problem zu beheben, schlage ich vor, die Datei im Lese-Schreib-Modus zu öffnen: RandomAccessFile(Dateiname, "rw")

5 Stimmen

Ich könnte mir andere Quellen vorstellen, um nur einen Teil der Datei zu lesen (Datei ist auf einer Netzwerkfreigabe ...) readFully() hat den Vertrag, nach dem Sie suchen.

85voto

Mihai Toader Punkte 11831

Im Grunde genommen müssen Sie sie im Speicher lesen. Öffnen Sie die Datei, weisen Sie das Array zu und lesen Sie den Inhalt der Datei in das Array.

Der einfachste Weg ist etwas Ähnliches wie dieser:

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();
}

Dies hat einige unnötige Kopien des Dateiinhalts zur Folge (eigentlich werden die Daten dreimal kopiert: von der Datei nach buffer , von buffer a ByteArrayOutputStream , von ByteArrayOutputStream auf das tatsächlich resultierende Array).

Sie müssen auch sicherstellen, dass Sie nur Dateien bis zu einer bestimmten Größe in den Speicher einlesen (dies ist normalerweise anwendungsabhängig) :-).

Sie müssen auch die IOException außerhalb der Funktion.

Eine andere Möglichkeit ist diese:

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;
}

Dies hat keine unnötigen Kopien zur Folge.

FileTooBigException ist eine benutzerdefinierte Anwendungsausnahme. Die MAX_FILE_SIZE Konstante ist ein Anwendungsparameter.

Für große Dateien sollten Sie wahrscheinlich einen Stromverarbeitungsalgorithmus in Erwägung ziehen oder Speicherzuordnung verwenden (siehe java.nio ).

0 Stimmen

Ios muss außerhalb des Trys deklariert werden

0 Stimmen

Die Anweisung "ios.read(buffer)" im zweiten Beispiel liest nur die ersten 4096 Bytes der Datei ein (unter der Annahme, dass der gleiche 4k-Puffer wie im ersten Beispiel verwendet wird). Damit das zweite Beispiel funktioniert, muss der Lesevorgang innerhalb einer while-Schleife stattfinden, die das Ergebnis auf -1 prüft (Ende der Datei erreicht).

0 Stimmen

Entschuldigung, ich habe meine obige Bemerkung verworfen und die Anweisung übersehen, den Puffer auf die Länge der Datei einzustellen. Trotzdem gefällt mir das erste Beispiel viel besser. Eine ganze Datei auf einmal in einen Puffer zu lesen ist nicht skalierbar. Wenn die Datei groß ist, besteht die Gefahr, dass der Speicher knapp wird.

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