【问题标题】:I want to open a text file and edit a specific line in java我想打开一个文本文件并在java中编辑一个特定的行
【发布时间】:2013-06-20 16:32:42
【问题描述】:

这是我编写的代码,而不是编辑特定的行,新名称被附加在最后...... 请帮帮我....

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();

}

【问题讨论】:

  • 你能告诉我request是什么吗?
  • FileWriter("d:\\book.txt", true) 将追加!!!!

标签: java


【解决方案1】:

除非您不更改行的(字节)长度,否则您需要重写整个文件,并在适当的地方添加更改的行。这实际上只是对您当前代码的简单更改。首先,在没有 append 的情况下初始化您的 FileWriter(因为您只想追加到文件的末尾,这就是您现在正在做的事情)。

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

然后,要么将整个文件读入内存(如果文件足够小),要么随时写入一个临时文件,然后在完成后将其复制过来。第二种方式更健壮,并且需要更少的代码更改;只需修改您的 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

完成后不要忘记关闭所有文件句柄!

【讨论】:

  • Java 7 更新 - 您可以让 Java 使用 try-with-resources 块处理关闭资源。 Oracle 教程位于docs.oracle.com/javase/tutorial/essential/exceptions/…
  • @Henry,如果您不更改文件的字节长度,是否有更快的方法来执行此操作,例如:您将行更改为相同字节长度的内容?
  • @OfekGila 如果您知道您没有更改字节长度,则可以使用RandomAccessFile 查找并简单地覆盖您想要的文件的任何部分。不过,根据我的经验,这往往会导致麻烦。
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多