为什么在Java中使用byteBuffer将char写入大文件时会得到额外的char'^ @'

时间:2014-04-17 21:19:40

标签: java file io character filewriter

我正在尝试将字符写入文件,不确定为什么写入^@

^@1^@:^@1^@ ^@2^@ ^@3^@ ^@3^@0^@4^@

这是预期的输出

1:1 2 3 3 0 4

有趣的是,对于较小的文件输出(当它长约几百行时),我不会得到这种奇怪的行为。

但是,当输出在100000+行时,我只会注意到这种奇怪的行为。

这是我的代码片段

final static int charByteSize= 2; // 1 char =2 bytes

writeTofile(FileChannel fc, ResultClass result) throws IOException {

        int key= result.getKey();
        List<Integer> values= result.getValues();
           StringBuilder sb=new StringBuilder();        
        sb.append(key+":");
        for(int value:values)
        {
            sb.append(value+" "); // space delimited value list
        }

        String stringToWrite=sb.toString().trim()+"\n"; //add newline char in end
        char[] arrToWrite=stringToWrite.toCharArray();

        ByteBuffer buf = ByteBuffer.allocate(arrToWrite.length*charByteSize);

        for(char theChar: arrToWrite)
        {
            buf.putChar(theChar);
        }

        buf.flip();     
        fc.write(buf);

} 

这里是调用函​​数伪代码,以防你需要看到它

public static void main(String args[])
{
         RandomAccessFile bfc = new RandomAccessFile(theFile, "rw");
         FileChannel fc = bfc.getChannel();    

           for() // run this loop 100000+ times
           {
            ResultClass result= getResultAfterSomeComplexCalculation();  
            writeTofile(fc,result);
           }


           fc.close();
           bfc.close

}

1 个答案:

答案 0 :(得分:1)

// 1 char =2 bytes

不,不是!存储明智这是真的;但在其他方面,这是错误的。 char只是Java中字符的基本存储单元;更准确地说,它是一个UTF-16代码单元。请注意,补充Unicode字符(U + 10000和更高)需要两个字符。

你存储在文件中的不是字符,而是字节。这意味着您首先需要将字符串编码为字节数组;例如:

final byte[] array = theString.getBytes("UTF-8");

然后将这些字节写入输出文件。