7

私はいくつかの基本的な Java I/O 操作を試みていました。以下のコードを実行してみます。

public static void main(String[] args) {
    File file = new File("fileWrite2.txt"); // create a File object
      try {
    FileWriter fr = new FileWriter(file);
    PrintWriter pw = new PrintWriter(file); // create a PrintWriter that will send its output to a Writer
    BufferedWriter br =  new BufferedWriter(fr);
    br.write("sdsadasdsa");br.flush();br.append("fffff");br.flush();
    pw.println("howdy"); // write the data
    pw.println("folks");
    pw.flush();
    pw.close();
    } catch (IOException e) {
       e.printStackTrace();
    }
}

上記を実行すると、作成されたファイルに次の出力が表示されます。

howdy
folks
f

「f」が最後の行に来る理由を誰か説明できますか?

4

3 に答える 3

7

は、 によってファイルに書き込まれた残りのf文字列に由来します。br.append("fffff");BufferedWriter

とは同じファイルに書き込むため、 で書き込まれたBufferedWriter内容が で書き込まれた内容を上書きします。PrintWriterPrintWriterBufferedWriter

しかし、いいえのようです。によって書き込まれたバイト数は、によってPrintWriter書き込まれたデータを完全に上書きするには 1 不足するBufferedWriterため、f.

これを に変更するbr.append("fffff");と、 が残ってbr.append("ffffg");いることがわかりますg。または、 に変更pw.println("folks");するpw.println("folks1");と、以前に書き込まれたデータが によって完全に上書きされたことが示されますPrintWriter

この混乱はすべて、問題の原因である同じファイル オブジェクトに対して 2 つの異なるライターがあるためです。@Borisが指摘したように、ファイルオブジェクトには1つのライターしかありません。

注: テストするもう 1 つの興味深い点はbr.flush();pw.flush();.

// br.flush(); // moved from here
pw.println("howdy"); // write the data
pw.println("folks");
pw.flush();
br.flush(); // to here
于 2013-11-14T07:20:54.587 に答える
3

これを行うことで、に15文字を書いbufferedwriterています `

br.write("sdsadasdsa");
br.flush();
br.append("fffff");`

しかし、printWriterで書いていると、今回書いているファイルの内容が上書きされます

pw.println("howdy"); // write the data
pw.println("folks");

これは 10 文字で\n\nWindows では\r\n. 全部で 14 です。つまり、f である 1 文字が残ります。

于 2013-11-14T07:34:13.580 に答える
2

コードでは、次の手順が実行されます。

1 いつ

br.write("sdsadasdsa");br.flush();br.append("fffff");br.flush();

実行されます。

ファイルの内容は

sdsadasdsafffff

2 when pw.println("howdy"); 呼んでいる。

文字列howdyは最初の 5 文字のsdsadをオーバーライドし、新しい行で行が終了します。txt では、2 文字が必要です\r\n。これにより、別の 2 文字が上書きされます。ファイルの内容は次のようになります。

howdy

dsafffff

3 when pw.println("folks"); 実行されます。

手順 2 で flush() メソッドを呼び出していないためです。文字列を使う人は、ファイルの 2 行目の内容を上書きします。別の2文字を上書きする改行。

次に、次のコンテンツがファイルに保存されます。

howdy

folks

f
于 2013-11-14T07:37:58.227 に答える