Problema muy simple: estoy leyendo desde un SocketChannel y me gustaría escribir los resultados en otro SocketChannel. Estoy usando un objeto Selector, por lo que espero hasta que se pueda leer un SocketChannel, vuelco los datos a un ByteBuffer, y luego, cuando el siguiente SocketChannel se pueda escribir, vuelvo a colocar allí el ByteBuffer. OK hasta ahora. Sin embargo, no parece que haya ninguna forma de "borrar" realmente un ByteBuffer, por lo que no puedo hacer ningún tipo de comprobación para saber cuándo han llegado nuevos datos.Borrado de un ByteBuffer
he probado el método .clear(), pero que al parecer no se borra la memoria intermedia, pero sólo restablece la posición de memoria intermedia a 1.
nunca programa en Java tan desnudo conmigo si esto es un problema con una solución "obvia" ...
Aquí hay un código de ejemplo:
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... */
}
Gracias!
Debe utilizar los 'ByteBuffer' como adjunto al registrar el canal al selector (tercer parámetro del método regsiter), de esa manera se puede recuperar el archivo adjunto del' SelectionKey' y evitar todo el anidado si las cláusulas . – mike