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



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

^@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 char =2 bytes

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新