2013-06-14 7 views
5

Ich verwende Java, um ein Byte-Array in eine Datei zu schreiben. Wenn ich meine Datei in einem Hex-Editor öffne, sehe ich nicht immer die Bytes, die ich erwartet habe. Hier ist mein Beispiel-Code und Inhalt der Ausgabedatei:Schreiben von Byte-Array in Datei. Nicht immer erwartet Ergebnis

public static void main(String[] args) 
{ 
    File file = new File("c:\\temp\\file.txt"); 
    file.delete(); 
    FileOutputStream outStream = null; 
    try 
    { 
     file.createNewFile(); 
    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try 
    { 
     outStream = new FileOutputStream(file); 
    } catch (FileNotFoundException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try 
    { 
    outStream.write(new byte[] { 0x14, 0x00, 0x1F, 0x50 }); 

    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Wenn ich die Datei in einem Hex-Editor öffne ich 00 9e f3 04 als Inhalt anstelle des Bytes, die ich geschickt. Meine Ergebnisse scheinen inkonsistent zu sein. Manchmal bekomme ich das erwartete Ergebnis und manchmal nicht.


Dies wird geben die richtigen Daten:

outStream.write(new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B });

Dateiinhalte sind:

14 00 1f 50 e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b 

Wenn ich ein weiteres Byte zu diesem Array fügen Sie dann scheitert es.

outStream.write(new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B, 0x30 });

Dateiinhalt sind jetzt:

14 e5 80 9f e4 bf a0 e2 83 90 e3 ab aa e1 81 a9 ed a2 a2 08 e3 80 ab 

Ich hatte auch Probleme mit diesem:

outStream.write(new byte[] { 0x4C, 0x00, 0x00, 0x00 }); 

Dateiinhalte sind:

4c 00 

Die letzten zwei Bytes werden nicht geschrieben.


outStream.write(new byte[] { 0x4C, 0x00, 0x00, 0x00, 0x01 }); 

Dadurch wird das erwartete Ergebnis. Dateiinhalte sind:

Ich fühle mich wie ich etwas Grundlegendes über die Art und Weise fehlen, wie Daten in Dateien geschrieben werden. Wie können konsistente Ergebnisse beim Schreiben von Byte-Arrays in eine Datei erhalten werden?

+3

Obwohl ich glaube nicht, dass es einen Unterschied machen wird, versuchen Sie '.flush()' dann '.close()' nachdem Sie '.write()' ... – fge

+1

Das ist * sehr * seltsam. Und das ist der genaue Code, den Sie ausführen? Kein 'Writer' irgendwo? Oder 'String'-Werte? Außerdem: Der 'createNewFile()' Aufruf sollte nicht notwendig sein. –

Antwort

1

Ich kompilierte genau Ihren Code und in der Ausgabedatei bekam ich, was erwartet wurde. Ich denke, es ist durchaus möglich, dass Ihr Notizblock (oder ein anderes Programm, das Sie verwenden, um die Datei zu überprüfen) Ihnen nicht einige der Bytes zeigt, die Sie schreiben (Beispiel: Textedit auf meinem Mac weigert sich, eine Liste möglicher Bytes anzuzeigen) . Wenn dies genau die Methode ist, die Sie verwenden, denke ich, dass es einige andere Dinge (wie Notepad) sind, die eher als Ihren Code fehlschlagen. Wie Sie bereits erwähnt haben, haben Sie manchmal den Eindruck, dass einige Bytes überhaupt nicht geschrieben werden. Vielleicht können Sie mit der Zwillingsmethode public void write(byte[] b, int off, int len) sicherstellen, wie viele Bytes eingegeben werden sollen.

+0

Das war das Problem. Ich benutzte das Hex-Editor-Plugin für Notepad ++, um die Datei zu lesen. Ich habe den HxD-Hex-Editor heruntergeladen und jetzt werden die Dateiinhalte wie erwartet gelesen. – esgeroth

0

Ich habe Ihren Code getestet und es ist nicht fehlgeschlagen für mich. Übertragen Sie Ihre Datei zwischen Servern? Da es sich um eine TXT-Datei handelt, könnten Sie eine automatische Textkonvertierung erhalten, haben Sie es ohne Erweiterung versucht?

Stellen Sie außerdem sicher, dass die Ressourcen nach Abschluss geschlossen sind.

Verwandte Themen