2013-10-21 35 views
0

我試圖寫一個文件抓取:從文件給不需要的結果

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

回答

0

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