2016-04-01 7 views
0

Ich habe ein Byte [], das serialisierte C++ - Datentypen enthält (so hat es ein seltsames Format, das die Standard-Java-Serialisierungsklassen nicht verstehen können). Ich habe meinen eigenen Deserialisierer erstellt, der Flags mit Typen vergleicht und sie in das entsprechende Objekt konvertiert (Eingabe könnte etwas wie dieses int64 mit dem Wert 4 [3, 0, 0, 0, 0, 0, 0, 0, 4], 3 ist der Merker für int64)Java: Konvertieren Byte-Stream in Objekte sehr effizient

private final ByteBuffer byteWrapper; 

// member ByteBuffer which is allocated in the ctor 

ctor { byteWrapper = ByteBuffer.allocateDirect(8); } 

// somewhere in the parse function, this case matches an int64 
case 3: 
{ 
     return byteWrapper.wrap(ios.getBytes(8)).getLong(); 
} 

Wo ios die vollständigen Serialisierungsdaten zum einfachen Lesen enthält. Nun, das funktioniert gut, aber hoher Durchsatz ist sehr wichtig für diesen Teil des Codes und ich bin kein normaler Java-Programmierer, also frage ich mich nur, ob jemand irgendwelche Vorschläge hat, diesen Prozess zu beschleunigen, entweder durch Überarbeitung, was ich ' Werde oder benutze ich verschiedene Klassen/Funktionen oder irgendetwas? Speicher ist kein Problem, ich bin nur an Geschwindigkeit interessiert

Antwort

1

Kopieren Sie nicht Ihre Daten in ein neues Pufferobjekt. Lies es direkt aus dem ios-Puffer.

byte type = ios.get(); 
switch (type) { 
    case 3: 
     return ios.getLong(); 
} 

Alle Getter in ByteBuffer erhöhen die Position entsprechend der Länge des Datentyps. get() erhöht die Position um 1, getLong() um 8, getFloat() um 4 ... Sie können direkt ios.getLong() verwenden. Unter der Annahme, dass die Werte nacheinander geschrieben werden, zeigt die neue Position auf das nächste Typ-Byte. Sie können also direkt ios.get() aufrufen, um den nächsten Typ zu erhalten.

Edit:

Wenn ios ein Input ist, können Sie verwenden Datainputstream zu lesen. Es unterstützt auch verschiedene Datentypen.

DataInputStream input = new DataInputStream(ios); 

byte type = input.readByte(); 
switch (type) { 
case 3: 
    return input.readLong(); 
} 

In Java gibt es im Wesentlichen zwei Pakete, die die Funktionalität bieten, die Sie suchen. java.io und java.nio. java.io enthält Streams, während java.nio Puffer enthält. java.nio ist schneller, weil es sehr niedrige Speicheroperationen verwendet. Wenn Sie nach Geschwindigkeit suchen, sollten Sie das verwenden. Das bedeutet auch, dass Sie den Typ von ios nach Möglichkeit in ByteBuffer ändern und dann meinen ersten Ansatz verwenden sollten.

+0

Das klingt gut, aber es sieht aus wie mein ios (java.io.InputStream) hat diese Methode nicht, gibt es einen anderen Strom, den ich verwenden sollte? – Madden

+0

@Madden bearbeitet noch einmal theres etwas, das Sie beachten sollten. –

Verwandte Themen