3

对于大字符串(60MB 左右),在我的文件末尾FileWriter附加额外的 s。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

null出于某种原因,我在文件末尾多了 584个 s。我发现字符串可能被过度分配是合理的,但这些不应该打印到文件中,对吧?更糟糕的是,如果我明确地给它长度:

fstream.write(dat, 0, dat.length());

行为是相同的。巧合的是,如果我说 (dat.length() - 584),它会做我想要的,但仅限于这种特定情况。

有任何想法吗?

JDK版本:1.7.0_02

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

4

4 回答 4

2

什么是“达”?如果“dat”是 StringBuffer,则需要小心。如果 StringBuffer 的长度大于其内容,则 null 将附加到末尾。您可以尝试使用 dat.toString()。我相信,空字符将在转换中被修剪。

于 2013-01-11T21:39:08.950 回答
1

我建议您永远不要使用 FileWriter,因为它使用您平台上的默认编码将字符串转换为字节流。

相反,您应该这样做:

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 文本字符串。

于 2013-01-11T21:37:20.903 回答
1

The file length depends on encoding. This test

System.out.println(dat.getBytes().length);

will show the length in bytes after encoding, because String.getBytes will use the same encoding (default) as new FileWriter(file)

于 2013-01-12T02:12:22.940 回答
0

因此,使用 63833144 长字符串运行测试,其中只有“A”,输出为:数据:63833144,文件:63833144

所以我确定问题是编码问题。

(我会将此作为评论发布,但因为我没有 50 个代表我无法:/)

于 2013-01-11T22:52:03.287 回答