如何使用ReadableByteChannel获取文件内容并将其存储在byteBuffer中?

时间:2012-02-19 21:06:49

标签: java bytebuffer

以下是我编写的代码。我想做一件简单的事情,将二进制文件数据存储到byteBuffer中。

File file = new File(fileName);
try {
    ReadableByteChannel channel = new FileInputStream(fileName).getChannel();
    ByteBuffer buf = ByteBuffer.allocateDirect(file.length());

    // How can use buf.read to get all the contents?

} catch (Exception e){

}

我想知道

  1. 如何使用read从频道获取所有数据并将其存储在ByteBuffer中
  2. 如果有更优雅的方式来分配ByteBuffer,除了使用File对象来获取文件的长度

2 个答案:

答案 0 :(得分:6)

我更喜欢使用内存映射。

FileChannel channel = new FileInputStream(fileName).getChannel();
ByteBuffer buf = channel.map(MapMode.READ_ONLY,0,channel.size());

如果文件大于2 GB,则必须有多个映射。从正面来看,无论大小如何,这都需要大约10毫秒,并且不管文件的大小如何都不会使用太多堆或直接内存。

答案 1 :(得分:4)

来自ReadableByteChannel Javadocs

  

读取(ByteBuffer dst)

  尝试从通道读取最多r个字节,其中r是缓冲区中剩余的字节数,即dst.remaining(),此时调用此方法。

所以... channel.read(buf);

至于你的第二个问题,如果你想立即将文件的全部内容读入内存,这似乎是一种合理的方法。