Byte [] zur Datei in Java

327

Mit Java:

Ich habe eine byte[], die eine Datei darstellt.

Wie schreibe ich das in eine Datei (dh C:\myfile.pdf)

Ich weiß, dass es mit InputStream gemacht wurde, aber ich kann es scheinbar nicht herausfinden.

elcool
quelle

Antworten:

502

Verwenden Sie Apache Commons IO

FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray)

Oder wenn Sie darauf bestehen, Arbeit für sich selbst zu machen ...

try (FileOutputStream fos = new FileOutputStream("pathname")) {
   fos.write(myByteArray);
   //fos.close(); There is no more need for this line since you had created the instance of "fos" inside the try. And this will automatically close the OutputStream
}
bmargulies
quelle
28
@R. Bemrose Nun, es schafft es wahrscheinlich, im traurigen Fall Ressourcen aufzuräumen.
Tom Hawtin - Tackline
1
Aus dem Dokument: HINWEIS: Ab Version 1.3 werden die übergeordneten Verzeichnisse der Datei erstellt, wenn sie nicht vorhanden sind.
Bmargulies
24
Wenn das Schreiben fehlschlägt, verlieren Sie den Ausgabestream. Sie sollten immer verwenden try {} finally {}, um eine ordnungsgemäße Ressourcenbereinigung sicherzustellen.
Steven Schlansker
3
Die Anweisung fos.close () ist redundant, da Sie Try-with-Resources verwenden, wodurch der Stream automatisch geschlossen wird, auch wenn das Schreiben fehlschlägt.
Tihomir Meščić
4
Warum sollte ich Apache Commons IO verwenden, wenn es 2 Zeilen mit regulärem Java ist
GabrielBB
185

Ohne Bibliotheken:

try (FileOutputStream stream = new FileOutputStream(path)) {
    stream.write(bytes);
}

Mit Google Guava :

Files.write(bytes, new File(path));

Mit Apache Commons :

FileUtils.writeByteArrayToFile(new File(path), bytes);

Alle diese Strategien erfordern, dass Sie auch irgendwann eine IOException abfangen.

SharkAlley
quelle
118

Eine andere Lösung mit java.nio.file:

byte[] bytes = ...;
Path path = Paths.get("C:\\myfile.pdf");
Files.write(path, bytes);
TBieniek
quelle
1
nur für Andorid O (8.0) +
Kangear
2
Ich glaube C:\myfile.pdfsowieso nicht, dass es auf Android funktionieren würde ...;)
TBieniek
37

Auch seit Java 7 eine Zeile mit java.nio.file.Files:

Files.write(new File(filePath).toPath(), data);

Wobei Daten Ihr Byte [] und filePath ein String ist. Sie können mit der StandardOpenOptions-Klasse auch mehrere Optionen zum Öffnen von Dateien hinzufügen. Fügen Sie Würfe oder Surround mit try / catch hinzu.

EngineerWithJava54321
quelle
6
Sie könnten Paths.get(filePath);anstelle vonnew File(filePath).toPath()
Tim Büthe
@Halil Ich denke nicht, dass das richtig ist. Laut den Javadocs gibt es ein optionales drittes Argument für offene Optionen und "Wenn keine Optionen vorhanden sind, funktioniert diese Methode so, als ob die Optionen CREATE, TRUNCATE_EXISTING und WRITE vorhanden wären. Mit anderen Worten, sie öffnet die Datei zum Schreiben und Erstellen der Datei, wenn sie nicht vorhanden ist, oder eine vorhandene reguläre Datei zunächst auf eine Größe von 0 abschneiden. "
Kevin Sadler
19

Ab Java 7 können Sie die Anweisung try-with-resources verwenden , um Ressourcenlecks zu vermeiden und das Lesen Ihres Codes zu vereinfachen. Mehr dazu hier .

Um Ihre byteArrayin eine Datei zu schreiben , würden Sie tun:

try (FileOutputStream fos = new FileOutputStream("fullPathToFile")) {
    fos.write(byteArray);
} catch (IOException ioe) {
    ioe.printStackTrace();
}
Voicu
quelle
Ich habe versucht, dies zu verwenden, und es verursachte Probleme mit Bytes, die keine UTF-8-Zeichen waren. Daher würde ich mit diesem vorsichtig sein, wenn Sie beispielsweise versuchen, einzelne Bytes zum Erstellen einer Datei zu schreiben.
pdrum
4

Versuchen Sie es mit einem OutputStreamoder genauerFileOutputStream

Gareth Davis
quelle
1
File f = new File(fileName);    
byte[] fileContent = msg.getByteSequenceContent();    

Path path = Paths.get(f.getAbsolutePath());
try {
    Files.write(path, fileContent);
} catch (IOException ex) {
    Logger.getLogger(Agent2.class.getName()).log(Level.SEVERE, null, ex);
}
Piyush Rumao
quelle
1

/////////////////////////// 1] File to Byte [] /////////////////////// // //

Path path = Paths.get(p);
                    byte[] data = null;                         
                    try {
                        data = Files.readAllBytes(path);
                    } catch (IOException ex) {
                        Logger.getLogger(Agent1.class.getName()).log(Level.SEVERE, null, ex);
                    }

//////////////////////// 2] Byte [] zur Datei ///////////////////// ///////

 File f = new File(fileName);
 byte[] fileContent = msg.getByteSequenceContent();
Path path = Paths.get(f.getAbsolutePath());
                            try {
                                Files.write(path, fileContent);
                            } catch (IOException ex) {
                                Logger.getLogger(Agent2.class.getName()).log(Level.SEVERE, null, ex);
                            }
Piyush Rumao
quelle
Vielen Dank für die Antwort. Aber ich habe Verwirrung bezüglich "Dateiname". Ich meine, welche Art von Datei speichern Sie die Daten? Kannst du bitte Erklären?
SRam
1
Hallo SRam, das hängt ausschließlich von Ihrer Anwendung ab, warum Sie die Konvertierung durchführen und in welchem ​​Format Sie die Ausgabe wünschen. Ich würde vorschlagen, ein TXT-Format zu wählen (z. B.: - myconvertedfilename.txt), aber es ist wieder Ihre Wahl.
Piyush Rumao
0

Grundlegendes Beispiel:

String fileName = "file.test";

BufferedOutputStream bs = null;

try {

    FileOutputStream fs = new FileOutputStream(new File(fileName));
    bs = new BufferedOutputStream(fs);
    bs.write(byte_array);
    bs.close();
    bs = null;

} catch (Exception e) {
    e.printStackTrace()
}

if (bs != null) try { bs.close(); } catch (Exception e) {}
barti_ddu
quelle
0

Dies ist ein Programm, in dem wir mit dem String Builder ein Array mit einem Versatz und einer Länge von Bytes lesen und drucken und das Array mit einer versetzten Länge von Bytes in die neue Datei schreiben.

` Geben Sie hier den Code ein

import java.io.File;   
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;        

//*This is a program where we are reading and printing array of bytes offset and length using StringBuilder and Writing the array of bytes offset length to the new file*//     

public class ReadandWriteAByte {
    public void readandWriteBytesToFile(){
        File file = new File("count.char"); //(abcdefghijk)
        File bfile = new File("bytefile.txt");//(New File)
        byte[] b;
        FileInputStream fis = null;              
        FileOutputStream fos = null;          

        try{               
            fis = new FileInputStream (file);           
            fos = new FileOutputStream (bfile);             
            b = new byte [1024];              
            int i;              
            StringBuilder sb = new StringBuilder();

            while ((i = fis.read(b))!=-1){                  
                sb.append(new String(b,5,5));               
                fos.write(b, 2, 5);               
            }               

            System.out.println(sb.toString());               
        }catch (IOException e) {                    
            e.printStackTrace();                
        }finally {               
            try {              
                if(fis != null);           
                    fis.close();    //This helps to close the stream          
            }catch (IOException e){           
                e.printStackTrace();              
            }            
        }               
    }               

    public static void main (String args[]){              
        ReadandWriteAByte rb = new ReadandWriteAByte();              
        rb.readandWriteBytesToFile();              
    }                 
}                

O / P in der Konsole: fghij

O / P in neuer Datei: cdefg

Yogi
quelle