3

大きな文字列 (60MB 程度)の場合、ファイルの末尾にFileWriter余分なnulls が追加されます。小さな文字列の場合、このコードは期待どおりに機能します。

わかりやすくするために、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());

要するに、どのような状況で、2 つの出力値が異なる必要があるのでしょうか?

これが私の出力例です:

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

ファイルの長さはエンコーディングによって異なります。このテスト

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

String.getBytesと同じエンコーディング(デフォルト)を使用するため、エンコーディング後の長さをバイト単位で表示しますnew FileWriter(file)

于 2013-01-12T02:12:22.940 に答える
1

FileWriter はプラットフォームのデフォルトのエンコーディングを使用して文字列をバイト ストリームに変換するため、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 に答える
0

したがって、「A」のみを含む 63833144 の長い文字列でテストを実行すると、出力は次のようになります。データ: 63833144、ファイル: 63833144

したがって、問題はエンコードの問題であると確信しています。

(これをコメントとして投稿したかったのですが、担当者が50人いないためできません:/)

于 2013-01-11T22:52:03.287 に答える