通过 Java 将文本插入到现有文件中
2022-09-01 17:12:41
我想创建一个简单的程序(在Java中)来编辑文本文件 - 特别是一个在文本文件中的随机位置插入任意文本片段的程序。此功能是我目前正在编写的大型程序的一部分。
阅读有关java.util.RandomAccessFile的描述,似乎在文件中间执行的任何写入操作实际上都会覆盖现有内容。这是一个副作用,我想避免(如果可能的话)。
有没有一种简单的方法可以实现这一目标?
提前致谢。
我想创建一个简单的程序(在Java中)来编辑文本文件 - 特别是一个在文本文件中的随机位置插入任意文本片段的程序。此功能是我目前正在编写的大型程序的一部分。
阅读有关java.util.RandomAccessFile的描述,似乎在文件中间执行的任何写入操作实际上都会覆盖现有内容。这是一个副作用,我想避免(如果可能的话)。
有没有一种简单的方法可以实现这一目标?
提前致谢。
好吧,这个问题已经很老了,但是FileChannels自Java 1.4以来就存在,我不知道为什么在处理替换或插入文件中的内容时没有在任何地方提到它们。文件通道很快,使用它们。
下面是一个示例(忽略异常和其他一些东西):
public void insert(String filename, long offset, byte[] content) {
RandomAccessFile r = new RandomAccessFile(new File(filename), "rw");
RandomAccessFile rtemp = new RandomAccessFile(new File(filename + "~"), "rw");
long fileSize = r.length();
FileChannel sourceChannel = r.getChannel();
FileChannel targetChannel = rtemp.getChannel();
sourceChannel.transferTo(offset, (fileSize - offset), targetChannel);
sourceChannel.truncate(offset);
r.seek(offset);
r.write(content);
long newOffset = r.getFilePointer();
targetChannel.position(0L);
sourceChannel.transferFrom(targetChannel, newOffset, (fileSize - offset));
sourceChannel.close();
targetChannel.close();
}
嗯,不,我不相信有一种方法可以避免用单个标准的Java IO API调用覆盖现有内容。
如果文件不是太大,只需将整个文件读入 ArrayList(每行一个条目),然后重写条目或为新行插入新条目。
然后用新内容覆盖现有文件,或将现有文件移动到备份并写入新文件。
根据编辑所需的复杂程度,您的数据结构可能需要更改。
另一种方法是在写入编辑后的文件时从现有文件中读取字符,并在读取流时对其进行编辑。