假设我有几个对象'存储在文本文件中的值。在开始时,会有一些值具有相同的值,例如,默认情况下所有学生的年龄都为0。现在,如果我想使用传统的文件处理方法在一个学生的年龄进行编辑,我将最终对所有其他0岁的学生进行更改,同时将我的数据写入临时文件。因此,我希望如果有更好的方法来使用java中的文件处理来更改文件。只是举一个问题的例子考虑以下文本文件
Edsger
迪杰斯特拉
123
72年露丝
迪杰斯特拉
12345
29年该行表示年龄和名称之间的空格。现在,我的任务是构建一个程序,用户可以在其中更改任何细节,例如名字,姓氏,roll_number或年龄。从上面给出的示例中可以看出,两个人可以共享一些常见的数据。在这种情况下,它是姓氏。但是,卷号(123,12345)将始终是唯一的。当您必须更改类似数据时,问题就出现了。假设用户想要编辑姓氏。然后,我会创建一个临时文件来保存这些数据,之后我会用一些条件读取这些数据。所以代码可能如下所示:
注意:此数据存储在已知位置"abc.txt"
。
BufferedReader br=new BufferedReader(new FileReader("abc.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("Temp.txt"));
String a=br.readLine();
while(a!=null)
{ bw.write(a);
bw.newLine();
a=br.readLine();
}
br.close();
bw.close();
BufferedReader br1=new BufferedReader(new FileReader("Temp.txt"));
BufferedWriter bw1=new BufferedWriter(new FileWriter("temp.txt"));
String b=br1.readLine();
while(b!=null)
{
if(b.equals(requested_surname))
bw1.write(w);//w is the String that holds the altered surname as desired by the User, for the sake of an example say it is Euler
else
bw1.write(b);
bw1.newLine();
b=br1.readLine();
}
bw1.close();
br1.close();
f.delete();
因此原始文本文件"abc.txt"
将显示如下内容: -
Edsger
欧拉
123
72年露丝
欧拉
12345
29年现在这将是一个拙劣的问题,因为我打算只改变露丝的姓氏!我知道这与我最初提出的问题略有不同,但我认为如果我可以定位下面的行" Ruth",我可以进行所需的更改。
请帮助......
答案 0 :(得分:0)
文件可以被认为是一个字符数组。
char[] file = ... // file (on disk)
char[] newData = ... // data to be written
int pos = ... // the position in the file to write to
for (i=0; i<newData.; i++) {
file[pos+i] = newData[i];
}
您可以特别使用seek()。 检查一下: http://docs.oracle.com/javase/tutorial/essential/io/rafs.html
答案 1 :(得分:0)
有几种方法可以做到这一点。
您可以将数据存储在csv文件中,每个对象包含1行:
123,Edsger,Dijkstra,72
12345,Ruth,Dijkstra,29
4567,Ruth,Euler,27
然后,在程序启动时读取内存中的所有对象(在结构中)以便于访问。在程序退出或保存时,将所有内容写回文件(假设对象的数量不是很大 - 即不是数百万)。
另一种方法是将对象的每个字段存储为固定宽度值:
123 Edsger Dijkstra 72
12345 Ruth Dijkstra 29
4567 Ruth Euler 27
这样,对数据的更改就可以轻松地在文件中“就地”写入。您只需确保字段不超过最大大小。如果需要,数字字段甚至可以是二进制格式。
对于每个对象具有固定的宽度或精确的大小,查找某个对象或卷号很容易(也更快):由于对象的大小已知,因此可以使用文件搜索直接跳转到每个对象的开头 - 不需要解析。
注意:在这种情况下,对象不需要在单独的行上(为清楚起见,我已经这样做了) - 但如果是,则换行符(可以是\ r或\ r \ n或\ n)必须添加到对象的大小。
当然,搜索某个人/对象时,应始终使用唯一的ID(在本例中为roll number),而不是名称。