3

これは、特定の行を編集する代わりに、最後に新しい名前が追加されるコードを書いたものです...助けてください....

PrintWriter writer = new PrintWriter(new BufferedWriter(
        new FileWriter("d:\\book.txt", true)));

BufferedReader br = null;
FileReader reader = null;
try {
    reader = new FileReader("d:\\book.txt");
    br = new BufferedReader(reader);
    String line;
    System.out.println((";;;;;;;;;;;;;;;;" + request
            .getParameter("hname")));
    System.out.println(request.getParameter("book"));
    while ((line = br.readLine()) != null) {

        if (request.getParameter("hname").equals(line)) {
            line = line.replace(request.getParameter("hname"),
                    request.getParameter("book"));

            writer.println(line);

            writer.close();
        }
    }

} catch (FileNotFoundException e) {
    e.printStackTrace();
}finally{
    reader.close();

}
4

1 に答える 1

7

行の (バイト) 長を変更しない限り、必要に応じて変更された行を追加して、ファイル全体を書き直す必要があります。これは実際には、現在のコードからの単純な変更にすぎません。最初に、 をFileWriter使用せずに初期化しますappend(ファイルの最後に追加するだけでなく、現在行っていることです)

PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("d:\\book.txt")));

次に、ファイル全体をメモリに読み込むか (ファイルが十分に小さい場合)、一時ファイルに書き込み、完了したらコピーします。2 番目の方法はより堅牢で、コードの変更が少なくて済みます。while ループを変更して、変更されているかどうかにかかわらず、すべての行を書き込むだけです。

// Open a temporary file to write to.
PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("d:\\book.temp")));

// ... then inside your loop ...

while ((line = br.readLine()) != null) {
    if (request.getParameter("hname").equals(line)) {
        line = line.replace(request.getParameter("hname"),
                request.getParameter("book"));
    }
    // Always write the line, whether you changed it or not.
    writer.println(line);
}

// ... and finally ...

File realName = new File("d:\\book.txt");
realName.delete(); // remove the old file
new File("d:\\book.temp").renameTo(realName); // Rename temp file

完了したら、すべてのファイル ハンドルを閉じることを忘れないでください。

于 2013-06-20T16:39:26.097 に答える