我需要写入特定索引位置的文件。 BufferedWriter
和PrintWriter
不允许写入索引。我如何去实现这一目标?写入特定索引的文件
基本上我想要做的是如果一个文件包含一个空行在EOF那么我需要在该位置写入,否则插入一个新行并写入。将文件的内容复制到临时文件,然后删除原始文件,然后再次将临时文件重命名为原始文件的名称不是一个选项。
谢谢
我需要写入特定索引位置的文件。 BufferedWriter
和PrintWriter
不允许写入索引。我如何去实现这一目标?写入特定索引的文件
基本上我想要做的是如果一个文件包含一个空行在EOF那么我需要在该位置写入,否则插入一个新行并写入。将文件的内容复制到临时文件,然后删除原始文件,然后再次将临时文件重命名为原始文件的名称不是一个选项。
谢谢
您需要使用RandomAccessFile
。
使用此类,您可以使用seek(long)
方法转到特定位置,并使用不同的write
方法编写。
如果您遇到特殊问题,最好的解决方案是使用RandomAccessFile
并使用RandomAccessFile
并导航到您的文件的末尾,即 。检查这是否是新行,写入,关闭。
如果文件包含非常大量的数据,我会有'OutOfMemory'问题吗? –
编号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
如果你在一个文本中的任意位置写入文件它可能是一条线的中间,并有可能在一个多字节字符的中间。你怎么知道它将在一行的开始?顺便说一句:你不能插入到一个文件只重新写你从一开始的一切。 –
@彼得:我们在这里说EOF,而不是随机的位置。如果你要进入EOF,你将不会处于多字节字符的中间。你可以检查前一个字节是否是CR或LF字符,以确定你是否在新行的开头。 –
@Vivien,这不是我所理解的“我需要在特定的索引位置写入文件”。如果所有OP想要做的事都追加到文件中,这可以在没有“插入”的情况下完成 –