2011-08-12 68 views
2

我需要寫入特定索引位置的文件。 BufferedWriterPrintWriter不允許寫入索引。我如何去實現這一目標?寫入特定索引的文件

基本上我想要做的是如果一個文件包含一個空行在EOF那麼我需要在該位置寫入,否則插入一個新行並寫入。將文件的內容複製到臨時文件,然後刪除原始文件,然後再次將臨時文件重命名爲原始文件的名稱不是一個選項。

謝謝

+0

如果你在一個文本中的任意位置寫入文件它可能是一條線的中間,並有可能在一個多字節字符的中間。你怎麼知道它將在一行的開始?順便說一句:你不能插入到一個文件只重新寫你從一開始的一切。 –

+0

@彼得:我們在這裏說EOF,而不是隨機的位置。如果你要進入EOF,你將不會處於多字節字符的中間。你可以檢查前一個字節是否是CR或LF字符,以確定你是否在新行的開頭。 –

+0

@Vivien,這不是我所理解的「我需要在特定的索引位置寫入文件」。如果所有OP想要做的事都追加到文件中,這可以在沒有「插入」的情況下完成 –

回答

5

您需要使用RandomAccessFile

使用此類,您可以使用seek(long)方法轉到特定位置,並使用不同的write方法編寫。

如果您遇到特殊問題,最好的解決方案是使用RandomAccessFile並使用RandomAccessFile並導航到您的文件的末尾,即 。檢查這是否是新行,寫入,關閉。

+0

如果文件包含非常大量的數據,我會有'OutOfMemory'問題嗎? –

+0

編號RandomAccessFile不會加載整個文件在內存中。所有操作都直接在磁盤上完成。 –

0

鑑於是在特定位置編寫內容的方法。

比方說我的文件是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 
相關問題