我编写的代码可以使用scanner类搜索文本文件中的某些特定文本(例如单词),但我还想在同一个旧文本位置中替换(旧文本到新文本)。 我在互联网上发现我必须使用replaceAll方法(replaceAll(old,new);) 但它不适用于扫描仪类。
这是我的代码,它只是搜索(如果它存在)在新行中写入新文本而不更改旧文本。
我是否需要将扫描仪的方法(获取数据)更改为FileReader ??
File file = new File("C:\\Users....file.txt");
Scanner input = new Scanner(System.in);
System.out.println("Enter the content you want to change:");
String Uinput = input.nextLine();
System.out.println("You want to change it to:");
String Uinput2 = input.nextLine();
Scanner scanner = new Scanner(file).useDelimiter(",");
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
while (scanner.hasNextLine()) {
String lineFromFile = scanner.next();
if (lineFromFile.contains(Uinput)) {
lineFromFile = Uinput2;
writer.write(lineFromFile);
writer.close();
System.out.println("changed " + Uinput + " tO " + Uinput2);
break;
}
else if (!lineFromFile.contains(Uinput)){
System.out.println("Don't found " + Uinput);
break;
}
}
答案 0 :(得分:2)
您无法从文件中读取,然后写入同一文件。你需要2个不同的文件。
while (read line from input file) {
if (NOT matches your search pattern)
write line to output file.
else { // matches
write start of line to your search pattern.
write your replace string
write from end of search pattern to end of line.
}
}
除非您的替换字符串与搜索字符串的大小相同,否则您必须使用2个文件。考虑一下文件:
Blah
Blah
Blah
现在更换字母' a'用"快速的布朗福克斯"。如果替换第一行,则表示您已覆盖文件的其余部分。现在你无法阅读第二行,所以是的,你必须使用2个文件。
答案 1 :(得分:0)
这是基于@Sedrick评论和您的代码的另一个答案。 我将它添加到您的伪代码中。
File file = new File("C:\\Users....file.txt");
Scanner input = new Scanner(System.in);
System.out.println("Enter the content you want to change:");
String Uinput = input.nextLine();
System.out.println("You want to change it to:");
String Uinput2 = input.nextLine();
Scanner scanner = new Scanner(file).useDelimiter(",");
java.util.List<String> tempStorage = new ArrayList<>();
while (scanner.hasNextLine()) {
String lineFromFile = scanner.next();
tempStorage.add(lineFromFile);
}
// close input file here
// Open your write file here (same file = overwrite).
// now loop through temp storage searching for input string.
for (String currentLine : tempStorage ) {
if (!lcurrentLine.contains(Uinput)){
String temp = currentLine.replace(Uinput, Uinput2);
write a line using temp variable
} else { // not replaced
write a line using currentLine;
}
// close write file here
顺便说一句,您必须使用try catch来封装读取写入以捕获IOExceptions。这就是我所知道的伪代码。在这个网站上有很多读/写文件的例子。它很容易搜索。