使用Java修改文件的内容

时间:2012-12-06 10:34:55

标签: java file-io io filereader filewriter

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

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

class FileReplace
{
    ArrayList<String> lines = new ArrayList<String>();
    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();
    }
}

6 个答案:

答案 0 :(得分:12)

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

public class FileReplace {
    List<String> lines = new ArrayList<String>();
    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();
    }
}

答案 1 :(得分:9)

接受的答案很棒。但是,有一种更简单的方法可以使用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需要由应用程序相应地捕获和处理。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

请务必:

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

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

答案 4 :(得分:0)

我可以看到三个问题。

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

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

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

答案 5 :(得分:0)

接受的答案有点不对劲。这是正确的代码。

    public class FileReplace {
List<String> lines = new ArrayList<String>();
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();
    }
}