我需要寫入特定索引位置的文件。 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想要做的事都追加到文件中,這可以在沒有「插入」的情況下完成 –