为什么我的使用FileChannel,ByteBuffer和CharBuffer的方式不像其他方式一样?

时间:2015-06-03 20:32:04

标签: java nio

给定文件

Orange
Purple
Indigo
Pink

为什么下面代码中的myWay方法不能通过ByteBuffer向我提供Charset.decode的内容?请注意,我验证ByteBuffer是否包含文件内容,但似乎无论我在myWay中使用何种方法,我都无法生成CharBuffer来获取内容。 otherWay方法按预期工作。有谁知道发生了什么?我已经阅读了ByteBufferCharBuffer的javdoc,但没有真正看到任何可以解释这一点的内容(或者我只是错过了它。)使用FileChannel.read vs {会有什么不同{1}}如果我可以使用FileChannel.map显示缓冲区的内容?

read

输出:

I did it MY WAY!......
manual string='Orange
Purple
Indigo
Pink'
CharBuffer='������������������������������������������������������������������������������������������������������'
CharBuffer='������������������������������������������������������������������������������������������������������'
........My way sucks.
The other way...
str = 'Orange
Purple
Indigo
Pink'
...works.

1 个答案:

答案 0 :(得分:4)

简单而细微:你不回放你的缓冲区。

当您致电FileChannel#read(ByteBuffer)时,此方法将提前缓冲区的position()

System.out.println("Before "+buffer.position()); // prints 0
int bytesRead = channel.read(buffer);
System.out.println("After  "+buffer.position()); // prints 28

当你将其解码为CharBuffer后,你实际上解码了那些从未被写入的99个字节(并且它们仍然是0)。

添加

buffer.rewind(); // (or buffer.position(0))
buffer.limit(bytesRead);

从文件通道读取数据后,decode方法完全抓取已接收数据的部分。