从文件给不需要的结果
问题描述:
我试图写一个文件抓取:从文件给不需要的结果
for(String s : str){
buffer.put(s.getBytes());
buffer.flip();
channel.write(buffer);
buffer.clear();
}
所以每当我从文件中取由char c = (char)randomAccessFile.readChar();
在这里,我没有得到这是在字符字符串。有人可以告诉我原因。
为了转换String
假设尝试字节即string.getBytes()
它给了6个字节的一件事。但我们知道,焦炭需要2
字节,因此它应该是16*6=96
。
答
RandomAccessFile
一个期望的字节数为基础字符串的内存中的表示。当你打电话给String.getBytes()
时,你会得到一个标准的表示字符串。这里是一个示例代码,它与RandomAccessFile
一起使用。请注意,它没有使用getBytes()
但铸造底层char
为byte
来代替。
public static void main(String [] args) throws IOException {
String str = "foo";
SeekableByteChannel channel = Files.newByteChannel(Paths.get("C:\\tmp\\foo.txt"), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
ByteBuffer buffer = ByteBuffer.allocate(1024);
for(int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
buffer.put((byte)(ch >> 8));
buffer.put((byte)ch);
}
buffer.flip();
channel.write(buffer);
RandomAccessFile file = new RandomAccessFile("/tmp/foo.txt", "rw");
try {
while(true) {
System.out.println(file.readChar());
}
} finally {
file.close();
}
}
+0
供参考:Java在内存中将字符存储为UTF-16(big endian),因此如果您愿意,可以使用getBytes(“UTF-16BE”)。这可能取决于JVM,但我不确定。 – Pace
来自哪里16 * 6?你是否想说你的字符串有48个字符? – Pace
@Pace 1 char = 16bits,我们有6个字符。 – Trying
好的。那么你会期望12个字节,这将是96位。你说得对,char需要2个字节的内存。但是,String.getBytes()并不返回Java在内存中使用的相同表示。返回的字节数组的大小取决于用于生成字节的编码。这是一个[示例](http://rextester.com/UCEB42773)的现象。 – Pace