2013-06-20 66 views
2

这是代码我已经写了而不是编辑一个特定的行新的名字得到了最后... 请帮我....我想打开一个文本文件,并在java中编辑特定的行

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

} 
+3

你能告诉我'request'是什么吗? – Dutts

+1

'FileWriter(“d:\\ book.txt”,true)'会追加!!!! – NINCOMPOOP

回答

7

除非您不改变行的(字节)长度,否则您需要重写整个文件,在适当的位置添加已更改的行。这实际上只是对当前代码的简单更改。首先,初始化您的FileWriter而不使用append(因为您的不需要想要追加到文件的末尾,这就是您现在正在执行的操作)。

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 

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

+0

Java 7更新 - 您可以让Java使用try-with-resources块处理关闭资源。可以在https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – Jeutnarg

+0

@Henry找到有关此教程的Oracle教程,如果不更改字节长度,是否有更快的方法来执行此操作例如:你正在改变行的内容是相同的字节长度? –

+0

@OfekGila如果你知道你不改变字节长度,你可以使用'RandomAccessFile'来寻找并简单地覆盖你想要的文件的任何部分。但以我的经验来看,这往往会引起麻烦。 –