从文件给不需要的结果

问题描述:

我试图写一个文件抓取:从文件给不需要的结果

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

+0

来自哪里16 * 6?你是否想说你的字符串有48个字符? – Pace

+0

@Pace 1 char = 16bits,我们有6个字符。 – Trying

+1

好的。那么你会期望12个字节,这将是96位。你说得对,char需要2个字节的内存。但是,String.getBytes()并不返回Java在内存中使用的相同表示。返回的字节数组的大小取决于用于生成字节的编码。这是一个[示例](http://rextester.com/UCEB42773)的现象。 – Pace

RandomAccessFile一个期望的字节数为基础字符串的内存中的表示。当你打电话给String.getBytes()时,你会得到一个标准的表示字符串。这里是一个示例代码,它与RandomAccessFile一起使用。请注意,它没有使用getBytes()但铸造底层charbyte来代替。

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