当前位置: 首页 > 知识库问答 >
问题:

用于修改特定行字符串的 RandomAccessFile

越涵衍
2023-03-14

介绍

我用这个项目挑战自己。

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

  • 将所有内容加载到内存中(地图,列表,数组...
  • 必须复制文件(例如 -

一个简单的.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 表示第一个数字 -

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");        



    }

理解问题

字符串 -

  • 最后两个“0”将是另一个日期格式,即“yy/MM/dd HH:MM:ss”和一个随机(int),这会增加长度,并会与.txt混淆

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

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

我想通过替换其位置上的字符串来添加它们。

注意事项

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

我对这个有什么期望?

能够在Java中修改文件中的行。这也可以是该动作的通用方法。

共有1个答案

西门安民
2023-03-14

html" target="_blank">存储介质(即硬盘、内存、闪存等)中没有文本文件这种东西。计算机总是以二进制(即字节)存储一切。文本文件是人类的概念。

以上面的例子为例:

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;

以下是前2行在计算机上的外观(十六进制):

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行,因为您已经覆盖了原始第一行的行终止字符。

综上所述,修改一个文本文件而不重写它是一件非常乏味和困难的任务。用你的修改重写整个程序会更快更容易。否则,相比之下,军事训练营就像在公园散步一样。

 类似资料:
  • 问题内容: 与该方法等效的 JavaScript 是什么: C#仅在字符串的 开头 和 结尾 处修剪所选字符! 问题答案: 一行就足够了: 在功能上:

  • 我有一个String,newNumber=106,nn=3和差异=3。 输出: 我想修改这个字符串,使输出变成,然后用这个新字符串我想再次修改它,使它变成,基本上我只需要替换新的数字,它是106,并且一直变为11,正如你所看到的,我试图只修改newNumber并用另一个替换它,同时保持整个字符串不变,我只是替换并添加它,这是如何实现的?输出应该是这样的,输出: 我在用步骤求解一个方程,公式无关紧要

  • 修改字符串 到目前为止,我们简单地搜索了一个静态字符串。正则表达式通常也用不同的方式,通过下面的 RegexObject 方法,来修改字符串。 方法/属性 作用 split() 将字符串在 RE 匹配的地方分片并生成一个列表, sub() 找到 RE 匹配的所有子串,并将其用一个不同的字符串替换 subn() 与 sub() 相同,但返回新的字符串和替换次数

  • 背景故事: 我需要根据我制作的字母表来排列单词。 我之前做了大量的循环,但我从之前问题的答案中得到了一个想法,可以像这样映射它: 所以词会变,苹果会变成苹果--- 这似乎覆盖了所有字符,因此输出为: 我的大脑今天很模糊,我想我可以一直坚持到最后,直到找到某种解决方案,但这似乎不是一种有效的方法。有什么想法吗? 此时,我从列表中提取一个单词,将其放入一个字符数组中,这样我就可以分别更改每个字符,然后

  • 本文向大家介绍C++ 修改字符串文字,包括了C++ 修改字符串文字的使用技巧和注意事项,需要的朋友参考一下 示例 C ++ 11 "hello world" 是字符串文字,因此对其进行修改会产生未定义的行为。 str上面示例中的初始化在C ++ 03中已正式弃用(计划从该标准的将来版本中删除)。2003年之前,许多编译器可能对此发出警告(例如,可疑转换)。2003年之后,编译器通常会警告不要使用转

  • 我希望打印字符串中的特定行。 字符串: 我只想要第二排和第三排。 我该怎么做呢?