14

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

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

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

6 回答 6

20

我将从关闭阅读器和刷新作者开始:

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();
    }
}
于 2012-12-06T10:45:52.347 回答
14

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

于 2015-08-07T07:45:07.693 回答
3

不能同时读取 + 写入同一个文件。

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

于 2012-12-06T10:41:36.137 回答
2

确保:

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

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

于 2012-12-06T10:39:47.773 回答
0

我可以看到三个问题。

首先,您要写入的out内容是 System.out,而不是文件的输出流。

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

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

于 2012-12-06T10:45:32.197 回答
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();
    }
}
于 2016-10-14T10:51:54.250 回答