给定文件
Orange Purple Indigo Pink
为什么下面代码中的myWay
方法不能通过ByteBuffer
向我提供Charset.decode
的内容?请注意,我验证ByteBuffer
是否包含文件内容,但似乎无论我在myWay
中使用何种方法,我都无法生成CharBuffer
来获取内容。 otherWay
方法按预期工作。有谁知道发生了什么?我已经阅读了ByteBuffer和CharBuffer的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.
答案 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
方法完全抓取已接收数据的部分。