使用Java修改文件的内容

我想用java程序删除一些文件内容,如下所示。 这是要在同一文件中替换的write方法,还是应该将其复制到另一个文件中。

但它删除了文件的所有内容。

class FileReplace { ArrayList lines = new ArrayList(); String line = null; public void doIt() { try { File f1 = new File("d:/new folder/t1.htm"); FileReader fr = new FileReader(f1); BufferedReader br = new BufferedReader(fr); while (line = br.readLine() != null) { if (line.contains("java")) line = line.replace("java", " "); lines.add(line); } FileWriter fw = new FileWriter(f1); BufferedWriter out = new BufferedWriter(fw); out.write(lines.toString()); } catch (Exception ex) { ex.printStackTrace(); } } public statc void main(String args[]) { FileReplace fr = new FileReplace(); fr.doIt(); } } 

我会先关闭读者,然后冲洗作家:

 public class FileReplace { List lines = new ArrayList(); String line = null; public void doIt() { try { File f1 = new File("d:/new folder/t1.htm"); FileReader fr = new FileReader(f1); BufferedReader br = new BufferedReader(fr); while ((line = br.readLine()) != null) { if (line.contains("java")) line = line.replace("java", " "); lines.add(line); } fr.close(); br.close(); FileWriter fw = new FileWriter(f1); BufferedWriter out = new BufferedWriter(fw); for(String s : lines) out.write(s); out.flush(); out.close(); } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String args[]) { FileReplace fr = new FileReplace(); fr.doIt(); } } 

接受的答案很棒。 但是,有一种更简单的方法可以使用Apache的commons-io库替换文件中的内容( commons-io-2.4.jar – 您可以使用任何最新版本)

 private void update() throws IOException{ File file = new File("myPath/myFile.txt"); String fileContext = FileUtils.readFileToString(file); fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED"); FileUtils.write(file, fileContext); } 

注意:应该由应用程序相应地捕获和处理抛出的IOException

同时读取+写入同一个文件是不行的。

编辑:改写并更正确和具体 – 在相同的线程中读取和写入同一文件,而不正确关闭阅读器(并刷新编写器)是不正常的。

确保:

  • 当您不再需要它们时close任何流
  • 特别是重新开放以进行写作之前
  • truncate文件,以确保如果你写的文件少于它,它会缩小。
  • 然后写输出
  • 写个别行,不要依赖toString
  • 写完后flushclose

如果使用缓冲 IO,则必须确保最后刷新缓冲区,否则可能会丢失数据!

我可以看到三个问题。

首先你写的是我假设的是System.out,而不是文件的输出流。

其次,如果您写入文件的输出流,则需要将其关闭。

第三, ArrayList上的toString()方法不会像你期望的那样编写文件。 循环遍历列表并一次写入一个String 。 问问自己是否还需要编写换行符。

接受的答案有点错误。 这是正确的代码。

  public class FileReplace { List lines = new ArrayList(); String line = null; public void doIt() { try { File f1 = new File("d:/new folder/t1.htm"); FileReader fr = new FileReader(f1); BufferedReader br = new BufferedReader(fr); while ((line = br.readLine()) != null) { if (line.contains("java")) line = line.replace("java", " "); lines.add(line); } fr.close(); br.close(); FileWriter fw = new FileWriter(f1); BufferedWriter out = new BufferedWriter(fw); for(String s : lines) out.write(s); out.flush(); } out.close(); catch (Exception ex) { ex.printStackTrace(); } }