FileWriter在文件末尾写入额外的空值

时间:2013-01-11 21:31:45

标签: java string file-io filewriter

对于大字符串(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

编辑:添加变量的文件类型(两个字符串)

4 个答案:

答案 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名代表我不能:/)