我已经设置了这个代码,我正在尝试编写一个程序来查看文件并找到一个特定的隐藏密码,然后用“found!”替换该单词。然后在控制台中重新打印文本文件。我知道如何使用读者和作者,但我不确定如何能够同时使用它们来做到这一点。代码如下:
读者类:
package Main;
import java.io.*;
public class Read {
private static String line;
FileReader in;
File file;
public Read() {
line = "";
}
public void readFile() throws IOException {
file = new File("C:examplePathName\\ReadWriteExp.txt");
in = new FileReader(file);
BufferedReader br = new BufferedReader(in);
while((line = br.readLine()) != null) {
System.out.println(line);
}
in.close();
}
public String getLine() {
return line;
}
public File getFile() {
return file;
}
}
Writer(更改)类:
package Main;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Change {
public static void main(String[] args) throws IOException{
Read r = new Read();
String line = r.getLine();
FileWriter fw = new FileWriter(r.getFile());
while(line != null) {
if(line.equals("example")) {
fw.write("found!");
}
System.out.println(line);
}
}
}
我是在正确的道路上还是应该将这两者合并为一个班级。这也是写入文本文件中特定行的正确方法吗?
答案 0 :(得分:0)
如果您只需要将转换后的文本打印到系统输出(而不是将其写入文件),则不需要第二个类。您可以在Read类的readFile()
方法中完成所需的操作:
public void readFile() throws IOException {
file = new File("C:examplePathName\\ReadWriteExp.txt");
in = new FileReader(file);
BufferedReader br = new BufferedReader(in);
while((line = br.readLine()) != null) {
System.out.println(line.replaceAll("example", "found!"));
}
in.close();
}
您可以进行许多其他调整,但这是您在问题中指定的功能的核心。
答案 1 :(得分:0)
如果文件大小合适,您可以将其读入内存,更改所需内容并再次将其写回:
public static void replaceOccurrences(String match, String replacement, Path path) throws IOException {
Files.write(path, Files.lines(path).map(l -> {
if(l.contains(match)) {
return l.replace(match, replacement);
} else {
return l;
}
}).collect(Collectors.toList()));
}
或者,如果您知道搜索词只出现一次而您只需找到事件的位置,请使用以下内容:
try(BufferedReader reader = Files.newBufferedReader(path)) {
int lineIndex = 0;
String line;
while(!(line = reader.readLine()).contains(match)) {
lineIndex++;
}
System.out.println(lineIndex); // line which contains match, 0-indexed
System.out.println(line.indexOf(match)); // starting position of match in line, 0-indexed
}