首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以编辑文本文件上的数据,而不必在Java中创建另一个临时文件?

是否有一种方法可以编辑文本文件上的数据,而不必在Java中创建另一个临时文件?
EN

Stack Overflow用户
提问于 2016-01-11 16:18:09
回答 2查看 329关注 0票数 0

假设我在文本文件中存储了几个对象的值。在开始时,会有一些值具有相同的值,例如,默认情况下,所有学生都有0岁。现在,如果我想使用传统的文件处理方法在一个学生的年龄进行编辑,我将最终对所有其他0岁的学生进行更改,同时将我的数据写入临时文件。因此,我希望如果有更好的方法使用java中的文件处理对文件进行更改。为了给出一个当前问题的例子,请考虑下面的文本文件

艾德塞

迪克斯特拉

123

72岁

露丝

迪克斯特拉

12345

29岁

这一行表示年龄和名称之间的空格。现在,我的任务是构建一个用户可以更改任何细节的程序,比如名字、姓氏、roll_number或年龄。从上面给出的例子中可以看出,两个人可以共享一些常见的数据。在这种情况下,它是姓。然而,登记号码(123,12345)将始终是唯一的。当您必须更改类似的数据时,问题就出现了。假设用户希望编辑姓氏。然后,我会创建一个临时文件来保存这些数据,然后我会用一些条件读取这些数据。因此,代码可能如下所示:注意:这些数据存储在已知的位置"abc.txt"

代码语言:javascript
复制
            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"将显示如下内容:-

艾德塞

欧拉

123

72岁

露丝

欧拉

12345

29岁

现在,这将是一个糟糕的问题,因为我打算只改变露丝的姓!我知道,这与我最初要求的略有不同,但我认为,如果我能瞄准“露丝”下面的那条线,我就能做出想要的改变。

请帮帮我..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-11 22:37:56

有几种方法可以做到这一点。

您可以将数据存储在csv文件中,每个对象1行:

代码语言:javascript
复制
123,Edsger,Dijkstra,72
12345,Ruth,Dijkstra,29
4567,Ruth,Euler,27

然后,在程序启动时读取内存中的所有对象(在一个结构中),以便于访问.在程序退出或保存时,将所有内容写回文件(假设对象的数量不是很大--即不是数百万)。

另一种方法是将对象的每个字段存储为固定的宽度值:

代码语言:javascript
复制
123    Edsger      Dijkstra    72
12345  Ruth        Dijkstra    29
4567   Ruth        Euler       27

这样,对数据的更改就可以很容易地在文件中写入“就位”。您只需确保字段不超过最大大小。如果需要,数字字段甚至可以采用二进制格式。

对于固定的宽度,或者每个对象的精确大小,查找某个对象或滚动号很容易(而且更快):由于已知对象的大小,所以可以使用文件查找直接跳转到每个对象的开头--不需要解析。

注意:在本例中,对象不需要放在单独的行上(为了清楚起见,我已经这样做了)--但如果是,则必须将新行(可能是\r或\r\n或\n)添加到对象的大小中。

当然,对某个人/对象的搜索应该总是在唯一的ID上进行,在这种情况下,应该是滚动号,而不是名称。

票数 0
EN

Stack Overflow用户

发布于 2016-01-11 16:22:35

可以将文件视为字符数组。

代码语言:javascript
复制
  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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34726263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档