0

BufferWriter形式と、それぞれブール値のtrueステートメントを持つFileWriterとPrintWriterを使用してみましたが、どちらも単純な新しいファイルを使用した場合と同じように動作します。プログラムの実行が終了するたびに、保存されたデータを書き込む関数を呼び出して追加します。最終的に発生するのは、最後に保存されたデータを上書きすることです。そのテキストファイルを処理する他のコードブロックもあり、それらを再フォーマットしても何も起こりませんでした。

//saves user information to "Users.txt" which will be called in the finally block after choice switch
public void writeUsers()
{
    try{

        File userFile = new File("Users.txt");
        PrintWriter output = new PrintWriter(userFile);
        for(User i: userList) {    
        output.append("Name:");    
        output.println(i.getrealName());
        output.append("UID:");
        output.println(i.getidName());
        output.append("Password:");
        output.println(i.getpassword());
        output.println(" ");
        }
        output.close();
        System.out.print("Information has been saved to Users.txt\n");


    }
    catch(FileNotFoundException fnf) {
        System.err.println("FileNotFoundException: File Users.txt does not exist " + fnf);
    }
    catch(IOException eyeoh) {
        System.err.println("IOException: Error writing to Users.txt " + eyeoh);
    }
} 
4

3 に答える 3

2

デフォルトでは、コンストラクターPrintWriter(File)は出力ファイルを切り捨てます。PrintWriterのメソッドが呼び出されるという事実append()は、開かれているファイルのモードを変更するという意味ではありません。の動作 appendは次のように説明されています。

out.append(csq) 形式のこのメソッドの呼び出しは、呼び出しとまったく同じように動作します。

 out.write(csq.toString()) 

PrintWriterここでは、FileOutputStreamfor を追加する forコンストラクターを使用できます。

PrintWriter output = 
   new PrintWriter(new FileOutputStream(userFile, true /* append = true */)); 
于 2013-02-09T21:54:37.760 に答える
1

PrintWriter追加モードで作成する必要があります。そうしないと、ファイルを最初に開いたときにクリアされます。次を使用して、追加モードで開くことができます。

new PrintWriter(new FileWriter(userFile,true)) // the `true` argument opens it in append mode
于 2013-02-09T21:54:36.610 に答える
1

デフォルトでは、PrintWriter はすべての既存のデータを切り捨てます。追加するには、他の回答が示唆するように、コンストラクターに「true」引数を追加します。これは、「append = true」を示します。

ただし、これは java.nio.file を使用するとより洗練された方法で行われます。java.nio.file と一緒のファイル。とは対照的に指定できるStandardOpenOption 、ファイルが存在しない場合にファイルを作成する などを指定することもできます。StandardOpenOption.APPENDStandardOpenOption.TRUNCATE_EXISTINGStandardOpenOption.CREATE

output.close()さらに、ステートメントをfinallyブロックに配置するか、try-with-resources を使用することを忘れないでください。そうしないと、プログラムのフローが中断された場合 (つまり、例外がスローされた場合)、output閉じられないままになります。手間がかからないので、個人的には try-with-resources を使用しています。すべてのリソースを宣言するだけで、プログラムの流れが中断されているかどうかに関係なく、リソースは自動的に閉じられます。

また、一般的なヒントとして、スローされた元のコンテンツを失わないように、単なる「カスタム文字列」ではなく、ブロック内の実際のExceptionオブジェクトを出力または渡します。次に、それを印刷したい文字列と連結できます。catchException

try(BufferedWriter bufWriter =
        Files.newBufferedWriter(Paths.get("Users.txt"),
            Charset.forName("UTF8"),
            StandardOpenOption.WRITE, 
            StandardOpenOption.APPEND, //Makes this BufferedWriter append to the file, not truncate
            StandardOpenOption.CREATE);
    PrintWriter output = new PrintWriter(bufWriter, true);)
{ 

    output.println("Text to be appended.");

}catch(FileNotFoundException e){
    System.err.println(e + "Custom string");
}catch(IOException e){
    System.err.println(e + "Something eyeoh occurred...");
}

これは、try-with-resources ステートメントを使用して、パラメーターを受け入れるBufferedWriterusingを宣言および作成し、resulting からの自動フラッシュ(コンストラクターで "true" で示されます) を作成します。のメソッドを呼び出して、ファイルに書き込むことができます。java.nio.file.FilesStandardOpenOptionPrintWriterBufferedWriterPrintWriterprintln()

このStandardOpenOptionコードで使用されるパラメーター: ファイルを書き込み用に開き、ファイルに追加するだけで、ファイルが存在しない場合はファイルを作成します。

Paths.get("path here")new File("path here").toPath()オブジェクトのみをFile使用している場合 (つまり、 を使用している場合JFileChooser.getSelectedFile())に置き換えることがCharset.forName("charset name")できます。目的の に対応するように変更することもできますCharset

于 2013-07-25T20:48:17.893 に答える