【问题标题】:Is there a way to edit data on a text file without having to create another temporary file in Java?有没有一种方法可以编辑文本文件上的数据而无需在 Java 中创建另一个临时文件?
【发布时间】:2016-01-12 06:37:56
【问题描述】:

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

埃兹格

迪克斯特拉

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" 将显示如下内容:-

埃兹格

欧拉

123

72 岁


露丝

欧拉

12345

29 岁

现在这将是一个笨拙的问题,因为我打算只更改 Ruth 的姓氏!我知道这与我最初询问的内容略有不同,但我认为如果我可以针对“Ruth”下方的行,我可以做出所需的更改。

请帮忙...

【问题讨论】:

  • Modifying existing file content in Java 的可能重复项。简单的回答:不,除非编辑将数据附加到文件末尾,或覆盖现有数据。
  • 是的,您当然可以就地编辑,但是(如上面@andy-turner 所说)只有在您不更改文件大小的情况下。例如,如果您需要将 0 更改为 15,您可以用“15”覆盖“0”,但不能用“15”覆盖“0”。因此,对于这种编辑,您希望您的字段具有恒定的宽度,而不是可变的宽度。也可以附加到文件中。查看随机访问文件。

标签: java file


【解决方案1】:

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

您可以将数据存储在 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,在这种情况下是卷号,而不是名称。

【讨论】:

    【解决方案2】:

    文件可以被认为是一个字符数组。

      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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2020-02-23
      • 2023-03-06
      相关资源
      最近更新 更多