使用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
。 - 写完后
flush
并close
!
如果使用缓冲 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(); } }