Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RandomAccessFile修改特定行的字符串_Java_File_Parsing_Randomaccessfile - Fatal编程技术网

Java RandomAccessFile修改特定行的字符串

Java RandomAccessFile修改特定行的字符串,java,file,parsing,randomaccessfile,Java,File,Parsing,Randomaccessfile,导言 我用这个项目挑战自己 我需要修改.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;asd

导言

我用这个项目挑战自己

我需要修改.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表示第一个数字->1;asd1324;2019-05-22 18:28:56;0;0;)

了解问题

字符串->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到最后一个条目号的数字(它是一个 代码)
我想通过替换其位置上的字符串来添加它们

注释

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

我希望从中得到什么


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

存储介质(即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;
以下是前两行在计算机上的外观(十六进制):

请注意行是如何终止的(0A),它是大多数*nix系统的行尾字符。在Windows上是0D0A(还是0A0D?),在Mac上是0D

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

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

您将得到(前两行):

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

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


尽管如此,在不重写文本文件的情况下修改文本文件可能是一项非常繁琐而艰巨的任务。通过修改重写整个过程会更快更容易。否则,相比之下,军事新兵训练营就像是在公园里散步。

存储介质(即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;
以下是前两行在计算机上的外观(十六进制):

请注意行是如何终止的(0A),它是大多数*nix系统的行尾字符。在Windows上是0D0A(还是0A0D?),在Mac上是0D

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

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

您将得到(前两行):

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

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


尽管如此,在不重写文本文件的情况下修改文本文件可能是一项非常繁琐而艰巨的任务。通过修改重写整个过程会更快更容易。否则,相比之下,新兵训练营就像是在公园里散步。

所有的队伍都一样长吗?@guest我提供的是。但如果不是的话,他们会改变加班检查“理解问题”。我将试图进一步澄清,最好给出明确的例子,而不是对可能发生的事情进行散文式的描述。例如,“我有
1;asd1324;2019-05-22 18:28:56;0;0;
,并希望将其替换为
1;asd1324;2019-05-22 18:28:56;0;123;
”。“替换既不会创建新文件,也不会销毁。”-如果要更改单行的大小,则需要从该点开始移动所有字节-收缩文件或扩展文件。如果这个过程因任何原因而失败——比如有人跳过电源线——你将不可避免地损坏你的文件。这种风险可能对你来说是可以接受的,但这是你在编写任何代码之前必须考虑的事情。也有其他选择,比如只附加文件格式,但它们是否合适取决于您的用例(您没有描述)。但是,一般来说,创建拷贝是风险最低的解决方案,而且通常成本最低(因为磁盘很便宜)。所有行的长度都相同吗?@guest我提供的是。但如果不是的话,他们会改变加班检查“理解问题”。我将试图进一步澄清,最好给出明确的例子,而不是对可能发生的事情进行散文式的描述。例如,“我有
1;asd1324;2019-05-22 18:28:56;0;0;
,并希望将其替换为
1;asd1324;2019-05-22 18:28:56;0;123;
”。“替换既不会创建新文件,也不会销毁。”-如果要更改单行的大小,则需要从该点开始移动所有字节-收缩文件或扩展文件。如果这个过程因任何原因而失败——比如有人跳过电源线——你将不可避免地损坏你的文件。这种风险可能对你来说是可以接受的,但这是你在编写任何代码之前必须考虑的事情。还有其他选择,例如仅附加文件格式,但是否附加
1;asd1324;2019-05-22 18:28:56;0;01;
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;