gram około z biblioteki NIO. Próbuję odsłuchać połączenie na porcie 8888 i gdy połączenie zostanie zaakceptowane, zrzuć wszystko z tego kanału do somefile
.Java NIO: transferFrom do końca strumienia
Wiem, jak to zrobić z ByteBuffers
, ale chciałbym, aby działało z rzekomo super wydajnym FileChannel.transferFrom
.
To jest to, co mam:
ServerSocketChannel ssChannel = ServerSocketChannel.open();
ssChannel.socket().bind(new InetSocketAddress(8888));
SocketChannel sChannel = ssChannel.accept();
FileChannel out = new FileOutputStream("somefile").getChannel();
while (... sChannel has not reached the end of the stream ...) <-- what to put here?
out.transferFrom(sChannel, out.position(), BUF_SIZE);
out.close();
Więc moje pytanie brzmi: Jak mogę wyrazić "transferFrom
jakiś kanał, aż zostanie osiągnięta end-of-stream"?
Edycja: Zmiana 1024 do BUF_SIZE, od wielkości użytego buforu, nie ma znaczenia dla kwestii.
pokonać mnie do niego. Można jednak użyć wartości "Long.MAX_VALUE" zamiast "Integer.MAX_VALUE". –
Dobrze, ale co, jeśli w pierwszym wywołaniu przeniesiemy 3 bajty na 10? – aioobe
Może przetestuj swój kanał źródłowy: ma on ['int read (ByteBuffer)'] (http://download.oracle.com/javase/6/docs/api/java/nio/channels/ReadableByteChannel.html#read% 28java.nio.ByteBuffer% 29). Jeśli to zwróci '-1', to nie ma w nim nic, a więc wszystko zostało przeniesione do' FileChannel'. Jeśli chcesz czegoś solidniejszego, to o wiele lepiej z 'ByteBuffer's (** ponowne użycie ** są i tak wydajne). –