15

假设我有一个名为 abhishek.txt 的文件,其中包含以下行

我是,你叫什么名字。

现在我想写

阿布舍克

在“我是”之后就像我是阿布舍克一样,..如何直接在这个特定位置写内容。

4

5 回答 5

13

您不能将数据插入文件中......文件系统(通常)根本不支持这样的操作。通常,您会打开一个文件进行读取和另一个写入,将文件的第一部分从一个流复制到另一个流,写入额外的部分,然后复制文件的第二部分。

如果您尝试替换原始文件,则需要将其删除并将新文件移动到位。

有时一次将整个文件读入内存可能更简单——这取决于你想要做什么,以及文件有多大。

于 2011-04-26T06:19:41.267 回答
11

您不能将数据插入文件中。您可以使用 覆盖特定位置的数据RandomAccessFile。但是,插入需要更改其后的所有数据。对于您的情况,请尝试以下方法:

File file = new File("abhishek.txt");
Scanner scanner = new Scanner(file).useDelimiter("\n");
String line = scanner.next();
String newLine = line.substring(0, 5) + "Abhishek" + line.substring(5);
FileWriter writer = new FileWriter(file);
writer.write(newLine);
writer.close();
于 2011-04-26T06:19:29.093 回答
4

一般来说,您需要读取旧文件,修改内存中的内容并再次将其写回。

这里有很多选项,比如是一次读取文件,还是一次读取一小段,是否替换现有文件等,但这通常是要使用的模式。

于 2011-04-26T06:19:25.003 回答
3

我设法使用 RandomAccessFile 做到了:

在此处输入图像描述

有了这个,您将获得一个包含预期“我是 Abhishek”内容的文件。即使您在第一行之后有内容,也可以将其保留在文件中(这是我最初的问题:我有一个大文件,我必须在某个字符串之后插入一些内容),而不是写在文件的末尾,这更容易。

于 2017-02-24T13:01:20.140 回答
2

你有三个选择:

  1. 使用 RandomAccessFile 可以使用的足够空间填充原始条目(并且您不关心一些额外的尾随空间。简单,但实用性有限
  2. 如果您经常这样做,请使用模板引擎(StringTemplate、Velocity 等)。如果你只做一次,可能工作量太大。
  3. 编写您自己的简单模板引擎,将其读入内存进行正则表达式替换并将其写回。不是特别有效,但如果您的使用非常简单且有限,也许是最好的折衷方案。
于 2011-04-26T06:22:50.093 回答