Java fileinput(读取和写入)到通过每一行循环的文件

时间:2014-09-10 00:50:26

标签: java bufferedreader fileinputstream

我有这个访问exisitng文件的方法,循环遍历每一行,如果符合条件,则将(字符串串行)替换为某一行:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.InputStreamReader;

private void UpdateConfig() {
    try {
        FileInputStream fstream = new FileInputStream("c:\\user\\config.properties");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        while ((strLine = br.readLine()) != null) {
            if (strLine.contains("FTPDate=2014/07/01 00:59:00")) {
                System.out.println("FILE " + strLine);
                strLine.replace("FTPDate=2014/07/01 00:59:00", "FTPDate=2014/09/10 00:00:00");
                //strLine.replace("((19|20)\\d\\d/(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])", "2014/09/10 00:00:00");
                System.out.println("FILE " + strLine);
            }
        }
        in.close();
    } catch (Exception e) {
    }
}

在sysout中,它似乎被替换了:

FILE FTPDateTejas=2014/07/01 00:59:00  
FILE FTPDateTejas=2014/09/10 00:00:00

但是当我检查文件时,日期仍保持不变。我错过了什么吗?有谁知道我错过了什么?谢谢

1 个答案:

答案 0 :(得分:0)

当你这样做时:

strLine = br.readLine()它会将BufferedReader中的下一行加载到内存中。这意味着您将数据存储在磁盘和内存中,并且这两者不会以任何方式相互链接。在strLine上进行修改时,我相信您的代码中有:

strLine = strLine.replace("FTPDate=2014/07/01 00:59:00", "FTPDate=2014/09/10 00:00:00");

由于replace不修改调用它的对象的内容,但返回一个新的String个对象(字符串是不可变的)。那么它会创建一个新对象,但不会修改您的磁盘数据(正如我所说,它不再与它相关联!)。

你可以思考"那么如何将这两者联系起来并覆盖文件?"。 Java确实提供了随机文件访问as described in the doc,但你唯一可以做的就是某个位置的modify个字符,你不能在中间插入东西。所以你要做的就是阅读文件的其余部分,进行修改,然后附加文件的其余部分,是的,你需要转移一些东西,以防你替换的新字符串比短的更长/更长你正在替换。

这就是为什么一个更简单的解决方案:

  1. 打开一个要写入的新文件
  2. 逐行写入( 替换后的字符串
  3. 删除旧文件并重命名新文件
  4. 不复制文件,代码看起来像这样:

    private void UpdateConfig() {
        File fstream = new File("c:\\user\\config.properties");
        File file = new File("c:\\user\\config.properties-new");
        try {
            file.createNewFile();
        } catch (IOException e) {
            // handle
        }
        try (FileReader in = new FileReader(fstream);
             FileWriter fw = new FileWriter(file.getAbsoluteFile())) {
    
            try (BufferedReader br = new BufferedReader(in);
                 BufferedWriter bw = new BufferedWriter(fw)) {
                String strLine;
                while ((strLine = br.readLine()) != null) {
                    if (strLine.contains("FTPDate=2014/07/01 00:59:00")) {
                        System.out.println("FILE " + strLine);
                        strLine = strLine.replace("FTPDate=2014/07/01 00:59:00",
                                "FTPDate=2014/09/10 00:00:00");
                        //strLine.replace("((19|20)\\d\\d/(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])", "2014/09/10 00:00:00");
                        bw.write(strLine);
                        System.out.println("FILE " + strLine);
                    }
                }
            }
            // copy files here
        } catch (IOException e) {
            // handle
        }
    }
    

    我在纯文本编辑器中写作时可能会出现一些逻辑/语法问题。我稍微修改了代码以使用Java 7的try-with-resources,这是一种比你正在做的更清晰的关闭资源的方法 - 当你的代码抛出异常时,流可能没有关闭