Would FileChannel.read read less bytes than specified if there's enough data?

后端 未结 2 513
温柔的废话
温柔的废话 2020-12-22 01:09

For example I have a file whose content is:

abcdefg

then i use the following code to read \'defg\'.

ByteBuffer bb = ByteBuf         


        
2条回答
  •  生来不讨喜
    2020-12-22 01:48

    Can I assume that the method returns a number less than limit of the given buffer only when there aren't enough bytes in the file?

    The Javadoc says:

    a read might not fill the buffer

    and gives some examples, and

    returns the number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream.

    This is NOT sufficient to allow you to make that assumption.

    In practice, you are likely to always get a full buffer when reading from a file, modulo the end of file scenario. And that makes sense from an OS implementation perspective, given the overheads of making a system call.

    But, I can also imagine situations where returning a half empty buffer might make sense. For example, when reading from a locally-mounted remote file system over a slow network link, there is some advantage in returning a partially filled buffer so that the application can start processing the data. Some future OS may implement the read system call to do that in this scenario. If assume that you will always get a full buffer, you may get a surprise when your application is run on the (hypothetical) new platform.

    Another issue is that there are some kinds of stream where you will definitely get partially filled buffers. Socket streams, pipes and console streams are obvious examples. If you code your application assuming file stream behavior, you could get a nasty surprise when someone runs it against another kind of stream ... and fails.

提交回复
热议问题