gpt4 book ai didi

java - RandomAccessFile 修改特定行的字符串

转载 作者:行者123 更新时间:2023-12-02 01:29:53 29 4
gpt4 key购买 nike

简介

我通过这个项目挑战了自己。

我需要修改 .txt 上特定行的数据而不执行接下来的事情:

  • 加载内存中的所有内容( map 、列表、数组...)
  • 必须复制文件(例如 -> 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 到最后一个条目编号的数字(它是代码)

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

注释

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

我对此有何期望

能够修改 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;

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

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;

你最终会得到(前两行):

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 行。

尽管如此,修改文本文件而不重写它可能是一项非常乏味且艰巨的任务。通过修改重写整个系统会更快更容易。否则,相比之下,军事训练营就像在公园散步一样。

关于java - RandomAccessFile 修改特定行的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262772/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com