Java 在特定索引处写入文件
我需要在特定的索引位置写入文件。BufferedWriter和PrintWriter不允许写入索引。我该如何实现这一目标 基本上我想做的是,如果一个文件在EOF处包含一个空行,那么我需要在该位置写入,否则插入一个新行并写入。将文件内容复制到临时文件,然后删除原始文件,然后再次将临时文件重命名为原始文件名,这不是一个选项 谢谢您需要使用 使用此类,您可以使用seeklong方法转到特定位置,并使用不同的写入方法进行写入 就你的特殊问题而言,最好的解决办法是Java 在特定索引处写入文件,java,file,writer,Java,File,Writer,我需要在特定的索引位置写入文件。BufferedWriter和PrintWriter不允许写入索引。我该如何实现这一目标 基本上我想做的是,如果一个文件在EOF处包含一个空行,那么我需要在该位置写入,否则插入一个新行并写入。将文件内容复制到临时文件,然后删除原始文件,然后再次将临时文件重命名为原始文件名,这不是一个选项 谢谢您需要使用 使用此类,您可以使用seeklong方法转到特定位置,并使用不同的写入方法进行写入 就你的特殊问题而言,最好的解决办法是 使用RandomAccessFile并导
使用RandomAccessFile并导航到文件末尾。检查这是否是新行,写入,关闭。给出了在特定位置写入内容的方法 假设我的文件是Test.txt,内容如下
Hello
How are you
Today is Monday
现在你想在打招呼后写你好。因此hi的偏移量为5
方法是:
filename = "test.txt";
offset = 5;
byte[] content = ("\t hi").getBytes();
private void insert(String filename, long offset, byte[] content) throws IOException {
RandomAccessFile r = new RandomAccessFile(filename, "rw");
RandomAccessFile rtemp = new RandomAccessFile(filename+"Temp", "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();
rtemp.close();
r.close();
}
输出将是:
Hello hi
How are you
Today is Monday
如果在文本文件中随机写入位置,那么它可能位于一行中,并且可能位于多字节字符的中间。你怎么知道它会在一行的开头?顺便说一句:你不能插入到一个文件中,只能从你到达的点重新写入所有内容。@Peter:我们这里说的是EOF,不是随机位置。如果您要访问EOF,您将不会处于多字节字符的中间。您可以检查前一个字节是否是CR或LF字符,以了解您是否在新行的开头。@Vivien,这不是我所理解的,因为我需要在特定索引位置写入文件。如果OP只想将其附加到文件中,则无需insert@Peter:问题的第二部分更详细地解释了问题。根据我从解释中了解到的情况,这是关于附加到文件的。如果OP可以澄清他/她正在尝试做什么,这将是非常有用的。如果文件包含非常大量的数据,我是否会有OutOfMemory问题?否。RandomAccessFile不会将整个文件加载到内存中。所有操作都直接在磁盘上完成。