好的,我说有一个名为“people.txt”的文本文件,它包含以下信息:
1 adam 20 M
2 betty 49 F
3 charles 9 M
4 david 22 M
5 ethan 41 M
6 faith 23 F
7 greg 22 M
8 heidi 63 F
基本上,第一个数字是该人的ID,然后是该人的姓名,年龄和性别。假设我想用不同的值替换第2行或ID号为2的人。现在,我知道我不能使用RandomAccessFile
因为名称并不总是相同的字节数,也不是年龄。在搜索随机Java论坛时,我发现StringBuilder
或StringBuffer
应该满足我的需求,但我不确定如何实现。它们可以用来直接写入文本文件吗?我希望这可以直接从用户输入工作。
答案 0 :(得分:7)
刚刚为你创建了一个例子
public static void main(String args[]) {
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("d:/new6.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
StringBuilder fileContent = new StringBuilder();
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println(strLine);
String tokens[] = strLine.split(" ");
if (tokens.length > 0) {
// Here tokens[0] will have value of ID
if (tokens[0].equals("2")) {
tokens[1] = "betty-updated";
tokens[2] = "499";
String newLine = tokens[0] + " " + tokens[1] + " " + tokens[2] + " " + tokens[3];
fileContent.append(newLine);
fileContent.append("\n");
} else {
// update content as it is
fileContent.append(strLine);
fileContent.append("\n");
}
}
}
// Now fileContent will have updated content , which you can override into file
FileWriter fstreamWrite = new FileWriter("d:/new6.txt");
BufferedWriter out = new BufferedWriter(fstreamWrite);
out.write(fileContent.toString());
out.close();
//Close the input stream
in.close();
} catch (Exception e) {//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
答案 1 :(得分:0)
一种解决方案可能是逐行读取文件,操作所需的行(执行一些解析/标记化以获取ID /名称等),然后将所有行写入文件(覆盖其当前内容)。此解决方案取决于您正在使用的文件的大小:太大的文件将消耗大量内存,因为您将所有内容一次保存在内存中
另一种方法(减少内存需求)是逐行处理文件,但不是将所有行保存在内存中,而是在处理完每行之后将当前行写入临时文件,然后移动临时文件到输入文件的位置(覆盖该文件)。
类FileReader
和FileWriter
应该可以帮助您读取/写入文件。您可能希望将它们包装在BufferedReader
/ BufferedWriter
中以提高性能。
另外,在完成读取(写入)文件时不要忘记关闭阅读器(也就是作者),因此文件仍然打开时不会阻止对文件的后续访问