我正在尝试将字符写入文件,不确定为什么写入^@
^@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
}
答案 0 :(得分:1)
// 1 char =2 bytes
不,不是!存储明智这是真的;但在其他方面,这是错误的。 char
只是Java中字符的基本存储单元;更准确地说,它是一个UTF-16代码单元。请注意,补充Unicode字符(U + 10000和更高)需要两个字符。
你存储在文件中的不是字符,而是字节。这意味着您首先需要将字符串编码为字节数组;例如:
final byte[] array = theString.getBytes("UTF-8");
然后将这些字节写入输出文件。