对于大字符串(60MB左右),FileWriter
会在文件末尾添加额外null
个。对于小字符串,此代码按预期工作。
为清楚起见,dat和filePath是字符串。
FileWriter fstream = new FileWriter( filePath );
fstream.write( dat );
fstream.close();
File f = new File( filePath );
System.out.println("Data: " + dat.length() + ", File: " + f.length());
简而言之,在什么情况下,两个印刷值是否应该不同?
这是我的示例输出:
Data: 63833144, File: 63833728
由于某种原因,我在文件末尾增加了584个null
个。我觉得字符串可能过度分配是合理的,但这些不应该打印到文件,对吧?更糟糕的是,如果我明确地给它一个长度:
fstream.write(dat, 0, dat.length());
行为是一样的。巧合的是,如果我说(dat.length() - 584),它就能满足我的需求,但仅限于此特定情况。
有什么想法吗?
JDK版本:1.7.0_02
编辑:添加变量的文件类型(两个字符串)
答案 0 :(得分:2)
什么是" dat"?如果" dat"是一个StringBuffer,你需要小心。如果StringBuffer的长度大于其内容,则null将附加到末尾。您可能尝试使用dat.toString()。我相信在转换中会修剪空字符。
答案 1 :(得分:1)
我建议您永远不要使用FileWriter,因为它在您的平台上使用默认编码将String转换为字节流。
相反,你应该这样做:
Writer writer =
new OutputStreamWriter(
new FileOutputStream( fileName ),
// Always specify encoding compatible with your string
"UTF-8"
);
try
{
writer.write( dat );
writer.flush( );
}
finally
{
writer.close( );
}
此外,字符串长度和结果字节流长度不必匹配。它们仅匹配ASCII文本字符串。
答案 2 :(得分:1)
文件长度取决于编码。这个测试
System.out.println(dat.getBytes().length);
将显示编码后的字节长度,因为String.getBytes
将使用与new FileWriter(file)
相同的编码(默认)
答案 3 :(得分:0)
所以使用63833144长字符串运行测试,其中只有'A',输出为: 数据:63833144,文件:63833144
所以我确定问题是编码问题。
(我会将此作为评论发布,但因为我没有50名代表我不能:/)