FileChannel.read(ByteBuffer)是否像RandomAccessFile.readFully(byte [])一样工作?

时间:2014-03-06 03:48:13

标签: java nio

RandomAccessFile.readFully docs说

  

“此方法从文件中重复读取,直到请求的数字   读取字节数。此方法将阻塞,直到请求的数量为止   读取字节,检测流的末尾或异常   抛出“。

我喜欢FileChannel.read的类似行为,但不确定正确的方法来保证它。

2 个答案:

答案 0 :(得分:0)

标题中的问题答案是“不”。只有合同才能转移至少一个字节。如果你想要更多,你必须循环,直到你得到它们。

答案 1 :(得分:0)

我找不到现有的实用工具方法,所以这里是一个未经过良好测试的实现

    void readFully(FileChannel file, ByteBuffer buf) throws IOException {
        int n = buf.remaining();
        int toRead = n;
        while (n > 0) {
            int amt = file.read(buf);
            if (amt == -1) {
                int read = toRead - n;
                throw new EOFException("reached end of stream after reading "
                        + read + " bytes; " + toRead + " bytes expected");
            } else {
                n -= amt;
            }
        }
    }