Is it possible to create non blocking ReadableByteChannel from InputStream object?
Channel.newChannel(inputStream) - produces channel which could be blocked by blocked InputStream.read invocation
Is it possible to create non blocking ReadableByteChannel from InputStream object?
Channel.newChannel(inputStream) - produces channel which could be blocked by blocked InputStream.read invocation
No it is not possible. See the Javadoc.
You may try to implement such a channel yourself, using 'Inputstream.avalable()' to avoid blocking. However, this method does not guarantee to return correct value, so you have to check the Inputstream implementation you use.
Are you sure you need non-blocking channel? Generally, it requires periodical polling to check arrival of data. Asynchronous channels, which invoke callbacks on data arrival, have more sense.
The ReadableByteChannel.newChannel method
public static ReadableByteChannel newChannel(final InputStream in) {
checkNotNull(in, "in");
if (in instanceof FileInputStream &&
FileInputStream.class.equals(in.getClass())) {
return ((FileInputStream)in).getChannel();
}
return new ReadableByteChannelImpl(in);
}
and the read method of ReadableByteChannelImpl
public int read(ByteBuffer dst) throws IOException {
int len = dst.remaining();
int totalRead = 0;
int bytesRead = 0;
synchronized (readLock) {
while (totalRead < len) {
int bytesToRead = Math.min((len - totalRead),
TRANSFER_SIZE);
if (buf.length < bytesToRead)
buf = new byte[bytesToRead];
if ((totalRead > 0) && !(in.available() > 0))
break; // block at most once
try {
begin();
bytesRead = in.read(buf, 0, bytesToRead);
} finally {
end(bytesRead > 0);
}
if (bytesRead < 0)
break;
else
totalRead += bytesRead;
dst.put(buf, 0, bytesRead);
}
if ((bytesRead < 0) && (totalRead == 0))
return -1;
return totalRead;
}
}
so, it's just calling the read method of the InputStream, and the javadoc of the Inputstream's read method:
This method blocks until input data is available, end of file is detected, or an exception is thrown.
so you can implements a subclass of InputStream and override the read methods, and implement the methods as nonblocking.