RandomAccessFile修改特定行的字符串

时间:2019-05-22 18:18:38

标签: java file parsing randomaccessfile

简介

我用这个孩子挑战自己。

我需要在.txt 的特定行上修改数据,而无需执行以下操作:

  • 将所有内容加载到内存中(映射,列表,数组...)
  • 必须复制文件(例如-> this),从而占用计算机空间(想象一个巨大的文件,很大!)
  • 没有关系数据库或类似的东西

一个简单的.txt文件将包含所有内容!

文本文件

1;asd1324;2019-05-22 18:28:56;0;0;
2;asd1324;2019-05-22 18:28:56;0;0;
3;asd1324;2019-05-22 18:28:56;0;0;
4;asd1324;2019-05-22 18:28:56;0;0;
5;asd1324;2019-05-22 18:28:56;0;0;
6;asd1324;2019-05-22 18:28:56;0;0;

遵循此格式,即带有“;”的字符串作为分隔符。

我的代码尝试使用0到9之间的数字

(0到9表示第一个数字-> 1 ; asd1324; 2019-05-22 18:28:56; 0; 0;)

public static void test(int lineNumber, String data)
    {
        String line;


          try{

              System.out.println("----DEBUG TEST----\n");

              RandomAccessFile file = new RandomAccessFile("parking.txt", "rw");

              System.out.println("File pointer is: " + file.getFilePointer());

              System.out.println("Line size is: " + file.readLine().length());

              System.out.println("Read line is: " + (line = file.readLine()) + " with size: " + line.length());     

              file.seek(line.length());

              System.out.println("File pointer is: " + file.getFilePointer());

              file.writeChars("\n");
              file.writeBytes("7;asd1324;2019-05-22 18:28:56;0;0;");
              file.writeChars("\n");


              System.out.println("File pointer is: " + file.getFilePointer());

              System.out.println("Line size is: " + file.readLine().length());

              System.out.println("Read line is: " + (line = file.readLine()) + " with size: " + line.length());    


              file.seek(lineNumber);

              file.close();

          }catch(IOException e){System.out.println(e);}

          System.out.println("\n----DEBUG TEST----\n");        



    }

了解问题

字符串-> 1; asd1324; 2019-05-22 18:28:56; 0; 0;

  • 最后两个'0'将是另一种日期格式,例如“ yy / MM / dd HH:mm:ss”和一个随机(int),这会增加长度,并且会弄乱.txt

示例:     1; asd1324; 2019-05-22 18:28:56; 2019-06-01 10:11:16; 100;

  • 第一个字符串是从0到最后一个条目号的数字(它是一个 代码)

我想通过替换String的位置来添加它们。

注释

我们将始终知道要修改的字符串的大小(方法)并采取相应的行动。

我对此有何期待

能够用Java修改文件中的行。这可能也是执行此操作的通用方法。

1 个答案:

答案 0 :(得分:2)

存储介质(例如HDD,RAM,闪存等)没有文本文件之类的东西。计算机始终将所有内容存储为二进制(即字节)。 文本文件是一个人类的概念。

以上面的示例为例:

1;asd1324;2019-05-22 18:28:56;0;0;
2;asd1324;2019-05-22 18:28:56;0;0;
3;asd1324;2019-05-22 18:28:56;0;0;
4;asd1324;2019-05-22 18:28:56;0;0;
5;asd1324;2019-05-22 18:28:56;0;0;
6;asd1324;2019-05-22 18:28:56;0;0;

这是前两行在计算机上的显示方式(十六进制):

313B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 303B0A
323B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 303B0A

请注意该行是如何终止的(0A),对于大多数* nix系统,该行的结尾字符。在Windows上将是0D0A(或者是0A0D?),在Mac上将是0D。

现在要更改一行,它绝对不能长于原始行,否则您将最终覆盖到下一行的开头。假设您将第一行更改为

1;asd1324;2019-05-22 18:28:56;0;0;

1;asd1324;2019-05-22 18:28:56;0;01;

您将获得(前2行):

313B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 30313B
323B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 303B0A

因此您的文件现在将被读取为 为:

1;asd1324;2019-05-22 18:28:56;0;01;2;asd1324;2019-05-22 18:28:56;0;0;
3;asd1324;2019-05-22 18:28:56;0;0;
4;asd1324;2019-05-22 18:28:56;0;0;
5;asd1324;2019-05-22 18:28:56;0;0;
6;asd1324;2019-05-22 18:28:56;0;0;

由于您已经覆盖了原始第一行的行终止符,因此现在您有5行而不是6行。

说了这么多,在不重写文本文件的情况下修改文本文件可能是一项非常繁琐而艰巨的任务。通过您的修改,可以更快,更轻松地重写整个过程。否则,相比之下,军事训练营就像走在公园里。