我有这个访问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
但是当我检查文件时,日期仍保持不变。我错过了什么吗?有谁知道我错过了什么?谢谢
答案 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
个字符,你不能在中间插入东西。所以你要做的就是阅读文件的其余部分,进行修改,然后附加文件的其余部分,是的,你需要转移一些东西,以防你替换的新字符串比短的更长/更长你正在替换。
这就是为什么一个更简单的解决方案:
不复制文件,代码看起来像这样:
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,这是一种比你正在做的更清晰的关闭资源的方法 - 当你的代码抛出异常时,流可能没有关闭