2017-06-09 2 views
2

Im folgenden Code für Steckdosen, erkläre ich einen Puffer Byte und höre für Client-Nachrichten in einer Schleife:Byte [] Puffer auf Nullen zurücksetzen?

// Create some buffer 
byte[] buffer = new byte[512]; 

while (true) 
{ 
    // Listen for messages from Client 

    int length = socket.getInputStream().read(buffer); 

    if (length != -1) 
     System.out.println(new String(buffer)); 
    else 
     break; 

    // Reset buffer here to zeros? 
} 

Jedes Mal, wenn ich benötigen würde, den Inhalt des Puffers zum Zurücksetzen eine neue Nachricht zu erhalten. Was ist der richtige Weg, dies zu tun?

+0

Das ist kein zuverlässiger Weg, um eine Zeichenfolge über ein erhalten Steckdose. Es gibt keine Garantie, dass ein vollständig codiertes Byte-Array in einem einzigen 'read()' Aufruf zurückgegeben wird. Verwenden Sie 'DataInput/DataOutput'' readUTF()/writeUTF() 'oder etwas Ähnliches. –

+0

@JamesKPolk: oder ich könnte Länge der Nachricht in Bytes übergeben .. – user963241

+0

Ja, das könnte funktionieren, vor allem, wenn Sie die Methoden von 'DataInput/DataOutput' wie' readInt()/writeInt() 'und' ReadFully() '. –

Antwort

3

Sie brauchen nicht den Puffer zurückzusetzen, müssen Sie einen String Konstruktor, der nicht über das Ende des Teils des Puffers geht, dass die empfangenen Bytes hat:

if (length != -1) { 
    System.out.println(new String(buffer, 0, length)); 
} 

Jetzt Ihr Code funktionieren auch, wenn der Puffer verschmutzt ist.

Hinweis: Für eine bessere Portabilität übergeben Sie den gewünschten Charset an String Konstruktor. Andernfalls stimmt die String Konstruktion nicht mit der Zeichenfolge überein, die Ihnen über den Socket gesendet wurde.

1

Vereinbaren Sie mit dasblinkenlight answers, aber die Frage selbst zu beantworten (wie ein Array zurückgesetzt werden), können Sie Arrays.fill einen Wert einzustellen, um jede Zelle verwenden können

byte[] array = new byte[10]; 
Arrays.fill(array, (byte)0); 
Verwandte Themen