通过Java将文本插入现有文件

Din*_*nuk 25 java filesystems file-io file

我想创建一个简单的程序(用Java编写)来编辑文本文件 - 特别是在文本文件中随机位置插入任意文本的文件.此功能是我目前正在编写的更大程序的一部分.

阅读有关java.util.RandomAccessFile的描述,似乎在文件中间执行的任何写操作实际上都会覆盖现有内容.这是一个副作用,我想避免(如果可能的话).

有没有一种简单的方法来实现这一目标?

提前致谢.

xor*_*_eq 16

好的,这个问题很老了,但是自Java 1.4以来就存在FileChannels,我不知道为什么在处理文件中替换或插入内容的问题时没有提到它们.FileChannels很快,使用它们.

这是一个例子(忽略异常和其他一些东西):

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();
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*tle 11

嗯,不,我不相信有一种方法可以避免使用单个标准Java IO API调用覆盖现有内容.

如果文件不是太大,只需将整个文件读入ArrayList(每行一个条目),然后重写条目或为新行插入新条目.

然后用新内容覆盖现有文件,或将现有文件移动到备份并写入新文件.

根据编辑需要的复杂程度,您的数据结构可能需要更改.

另一种方法是在写入编辑文件时从现有文件中读取字符,并在读取时编辑流.