2011-01-15 15 views
0

Ich bin auf der Suche nach etwas Einfaches (keine externe lib vorzugsweise), um ein Byte [] aus einer Datei zu schreiben und zu laden. Mehr oder weniger etwas wie [Python's Pickle] [1].Schreiben und lesen Byte [] aus der Datei

Das Problem scheint zu sein, dass ich die Object-Struktur aus einer Datei wie diesem nicht lesen kann. In einem Hex-Editor enthält die Datei "somebytes" nur ein paar oder 0s. Es scheint also nicht, dass der FileOutputStream irgendeinen Inhalt ("t" oder das Byte-Äquivalent) in ihn einfügt.

[1] http://wiki.python.org/moin/UsingPickle

Antwort

4

Sie einen Byte-Puffer mit der Größe zugewiesen haben von bytes, aber das bedeutet nicht, der Byte-Puffer mit dem Byte-Array zugeordnet ist. Sie können ein Byte-Array mit ByteBuffer.wrap umbrechen.

Hier ist eine minimale Änderung an Ihren Code, die tut die t in die Datei schreiben:

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = ByteBuffer.wrap(bytes); 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

Beachten Sie, dass für echten Code, den Sie immer geschlossen ist ein try/finally sicherstellen, blockieren, um die Datei verwenden sollten unabhängig von Ausnahmen.

Dies ist jedoch ein langer Weg von der Serialisierung. Java hat seine eigene binäre Serialisierung - siehe ObjectOutputStream und ObjectInputStream. Persönlich vermeide ich diese Art der Serialisierung jedoch, da sie angesichts von Klassenänderungen sehr brüchig sein kann. Es gibt verschiedene andere Ansätze zur Serialisierung, z. B. die Verwendung von Thrift- oder Protokoll-Puffern für die Binärserialisierung oder das Serialisieren in XML, JSON oder ein anderes von Menschen lesbares Format.

+0

Sie haben ein Byte für 't', gefolgt von 9 Null '\ 0' Bytes. Nicht sicher, dass das beabsichtigt war. –

+0

@Peter: Ich habe nur versucht, den ursprünglichen Code zu bekommen * einige Daten * auf die Festplatte zu schreiben. Da das letztendliche Ziel eine vollständigere Serialisierung war, habe ich das im letzten Teil der Antwort diskutiert. –

0

Sie können

seek(position) 
b = read(length) 

Dann b wird ein Array von Bytes Ihrer Länge sein.

Entschuldigung - wenn Sie weiterlesen, suchen Sie schreiben, nicht lesen.

-1

Eine einfachere Version der gleichen Sache ist.

byte[] bytes = new byte[10]; 
bytes[1] = 't'; 

FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

Es gibt viele Beispiele zum Lesen/Schreiben von Byte [] aus Dateien im Internet. Probiere Google aus.

+2

Während das kompiliert, ist es nur etwas nebensächlich, weil Sie eine char-Konstante verwenden, die zufällig im Bereich eines Bytes ist - versuchen, * Zeichen * in einem Byte-Array direkt so zu speichern (anstatt irgendeine Art von spezifischen zu verwenden) Kodierung oder sogar ein Char-Puffer, der das Byte-Array umhüllt) ist eine wirklich schlechte Idee. –