使用Buffer reader我解析整个文件。如果找到Oranges:pattern,我想用ApplesAndOranges替换它。
try (BufferedReader br = new BufferedReader(new FileReader(resourcesFilePath))) {
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("Oranges:")){
int startIndex = line.indexOf(":");
line = line.substring(startIndex + 2);
String updatedLine = "ApplesAndOranges";
updateLine(line, updatedLine);
我调用方法updateLine,然后传递原始行以及更新的行值。
private static void updateLine(String toUpdate, String updated) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(resourcesFilePath));
PrintWriter writer = new PrintWriter(new File(resourcesFilePath+".out"), "UTF-8");
String line;
while ((line = file.readLine()) != null)
{
line = line.replace(toUpdate, updated);
writer.println(line);
}
file.close();
if (writer.checkError())
throw new IOException("Can't Write To File"+ resourcesFilePath);
writer.close();
}
要使文件更新,我必须使用其他名称(resourcesFilePath +" .out")保存它。如果我使用原始文件名,则保存的版本将变为空白 所以这是我的问题,如何在不丢失任何数据的情况下用原始文件中的任何值替换一行。
答案 0 :(得分:0)
为此,您需要使用正则表达式(RegExp),如下所示:
str = str.replaceAll(" ^ Orange:(。*)"," OrangeAndApples:$ 1");
这是一个例子,也许它并不是你想要的,但在这里,在第一个参数中,parentesis中的表达被称为捕获组。找到的表达式将替换为第二个参数,$ 1将替换为捕获组的值。在我们的示例中,Orange:一行开头的Hello将被OrangeAndApples取代:Hello。
在你的代码中,它接缝你每行创建一个文件...也许内联子方法会更好。
try (
BufferedReader br = new BufferedReader(new FileReader(resourcesFilePath));
BufferedWriter writer = Files.newBufferedWriter(outputFilePath, charset);
) {
String line;
while ((line = br.readLine()) != null) {
String repl = line.replaceAll("Orange:(.*)","OrangeAndApples:$1");
writer.writeln(repl);
}
}
答案 1 :(得分:0)
在原始决赛中写出所有内容的最简单方法是阅读所有内容 - 更改您想要更改的内容并关闭流。然后再次打开文件,然后用你想要的数据覆盖文件及其所有行。
答案 2 :(得分:0)
您可以使用RandomAccessFile写入文件,使用nio.Files从中读取字节。在这种情况下,我把它作为一个字符串。
您也可以使用RandomAccessFile读取该文件,但在我看来,这样做更容易。
import java.io.RandomAccessFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
public void replace(File file){
try {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
Path p = Paths.get(file.toURI());
String line = new String(Files.readAllBytes(p));
if(line.startsWith("Oranges:")){
line.replaceAll("Oranges:", "ApplesandOranges:");
raf.writeUTF(line);
}
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}