Clearing-ein ByteBuffer
Sehr einfaches problem: ich lese aus einem SocketChannel und möchte schreiben die Ergebnisse auf ein anderes SocketChannel. Ich bin über einen Selektor-Objekt, so dass ich warten, bis einer der SocketChannel lesbar ist, dump die Daten in einen ByteBuffer, und dann, wenn die nächste SocketChannel beschreibbar ist, habe ich einen dump der ByteBuffer es. OK so weit. Es wird jedoch nicht angezeigt, gibt es eine Möglichkeit, eigentlich "klar" einen ByteBuffer, so kann ich das nicht jede Art von überprüfen, um zu wissen, Wann neue Daten da sind.
Ich ausprobiert habe .clear () - Methode, aber, dass anscheinend nicht klar, das Puffer -, sondern nur setzt die buffer-position 1.
Hier einige Beispiel-code:
ByteBuffer channel1buf = ByteBuffer.allocate(1024);
ByteBuffer channel2buf = ByteBuffer.allocate(1024);
if (key.isReadable()) {
if (key.channel().equals(channel1)) {
channel1.read(channel2buf);
} else if (key.channel().equals(channel2)) {
channel2.read(channel1buf);
}
} else if (key.isWritable()) {
if (key.channel().equals(channel1) && channel1buf.asCharBuffer().length() > 0) {
channel1.write(channel1buf);
/* some way to clear channel1buf */
} else /* same idea for channel2... */
}
- Sollten Sie die
ByteBuffer
als Anhang während der Registrierung von Kanal zu dem Selektor (Dritter parameter der regsiter-Methode), so können Sie abrufen, die Anlage aus derSelectionKey
und vermeiden Sie alle verschachtelten if-Klauseln.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Buffer.clear
setzt die position, ja, und dann können SiegetPosition() > 0
zu überprüfen, wenn etwas Hinzugefügt wurde, um den Puffer danach, nicht...?getPosition()
und Sie sollten in Ordnung sein...oder ist es etwas, was ich bin fehlt?Buffer.clear()
es setzt die schreib-position auf 0, so dass jede neue schreibt in den Puffer schreiben Sie einfach über die alten Daten, die du hast.Ich gelöst gleiche problem, das der code, hoffe es kann dir helfen.
Arrays.fill(channel1buf, (byte) 0); channel1buf.clear();
ZeroMemory()
zu einem buffer ist nicht erforderlich, wenn Sie verwenden dieByteBuffer
Klasse so wie es ist verwendet werden soll, die durch den Aufrufflip()
vor dem Lesenrewind()
vor re-Lektüre,clear()
odercompact()
vor dem schreiben.