我正在尝试向文件写入字符,不确定它为什么要写入^@
^@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");
然后将这些字节写入输出文件。