Hi Pavel,

So then our transferTo() implementation should be like this?

 while ((read = this.read(buffer, 0, TRANSFER_BUFFER_SIZE)) > -1) {

That would then look like the code I used to write…

-Patrick


> Am 14.05.2015 um 00:14 schrieb Pavel Rappo <pavel.ra...@oracle.com>:
> 
> 
>>>> The other reason to have read that returns 0 is if the underlying channel 
>>>> is in non-blocking mode.
>>>> A read on an InputStream created by Channels.newInputStream on a 
>>>> SelectableChannel may return 0
>>>> and the code will go in a loop until the SelectableChannel can read 
>>>> something.
>>>> while(read() > 0) avoid that issue.
>>> It doesn't seem possible as far as I can see. We have 2 methods in
>>> java.nio.channels.Channels:
>>> 
>>>   newInputStream(java.nio.channels.ReadableByteChannel)
>>>   newInputStream(java.nio.channels.AsynchronousByteChannel)
>>> 
>>> Neither ReadableByteChannel nor AsynchronousByteChannel is 
>>> SelectableChannel.
>> 
>> SocketChannel is a subtype of both ReadableByteChannel and SelectableChannel.
> 
> Yes, you're right.
> 
>>> Sorry, I might be missing something. Anyway, it would be a misbehaving
>>> InputStream as it doesn't conform to the spec.
>> 
>> if the read is non-blocking, it can read 0 byte which is conform to the 
>> InputStream.read spec,
>> or am i missing something ?
> 
> * <p> If <code>len</code> is zero, then no bytes are read and
> * <code>0</code> is returned; otherwise, there is an attempt to read at
> * least one byte. If no byte is available because the stream is at end of
> * file, the value <code>-1</code> is returned; otherwise, at least one
> * byte is read and stored into <code>b</code>.
> 
> So as far as I can see, returning 0 as a number of bytes read is not an 
> option,
> unless len == 0
> 

Reply via email to