I am using following way to write InputStream
to File
:
private void writeToFile(InputStream stream) throws IOException {
String filePath = "C:\\Test.jpg";
FileChannel outChannel = new FileOutputStream(filePath).getChannel();
ReadableByteChannel inChannel = Channels.newChannel(stream);
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(true) {
if(inChannel.read(buffer) == -1) {
break;
}
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
inChannel.close();
outChannel.close();
}
I was wondering if this is the right way to use NIO. I have read a method FileChannel.transferFrom
, which takes three parameter:
- ReadableByteChannel src
- long position
- long count
In my case I only have src
, I don't have the position
and count
, is there any way I can use this method to create the file?
Also for Image is there any better way to create image only from InputStream
and NIO?
Any information would be very useful to me. There are similar questions here, in SO, but I cannot find any particular solution which suites my case.
I would use Files.copy
as for your version
ByteBuffer.allocateDirect
is faster - Java will make a best effort to perform native I/O operations directly upon it.Closing is unreliable, if first fails second will never execute. Use try-with-resources instead, Channels are
AutoCloseable
too.No it's not correct. You run the risk of losing data. The canonical NIO copy loop is as follows:
Note the changed loop conditions, which take care of flushing the output at EOS, and the use of
compact()
instead ofclear(),
which takes care of the possibility of short writes.Similarly the canonical
transferTo()/transferFrom()
loop is as follows:It must be called in a loop, as it isn't guaranteed to transfer the entire quantum.