2011-08-12 8 views
2

ファイルに特定のインデックス位置で書き込む必要があります。 BufferedWriterおよびPrintWriterはインデックスへの書き込みを許可しません。これを達成するにはどうすればいいですか?特定のインデックスでファイルに書き込む

基本的には、ファイルにEOFに空の行が含まれている場合、その位置に書き込む必要があります。そうでない場合は、新しい行を挿入して書き込みます。ファイルの内容を一時ファイルにコピーした後、元のファイルを削除した後、再び一時ファイルの名前を元のファイルの名前に変更することはできません。あなたはRandomAccessFileを使用する必要が

おかげ

+0

あなたがテキストファイル内のランダムな場所に記述する場合、そのおそらくでは、行の途中になる可能性が高いですマルチバイト文字の中間。どのようにそれが行の先頭になることを知っていますか?ところで、ファイルに挿入することはできませんあなただけのポイントからすべてを書き換えます。 –

+0

@Peter:私たちはここでEOFを話しています。ランダムな位置ではありません。あなたがEOFに行くなら、あなたはマルチバイト文字の真中にいません。また、新しい行の先頭にあるかどうかを知るために、前のバイトがCRかLFかどうかを調べることができます。 –

+0

@Vivienこれは、「特定のインデックス位置にあるファイルに書き込む必要がある」ということではありません。すべてのOPがファイルに追加したい場合は、「挿入」なしで行うことができます –

答えて

5

このクラスを使用すると、seek(long)メソッドを使用して特定の場所に移動し、異なるwriteメソッドを使用して書き込むことができます。

特に問題が発生した場合は、 となり、RandomAccessFileを使用してファイルの最後までナビゲートしてください。これが新しい行であるかどうかを確認し、書き込み、終了します。

+0

ファイルに非常に大量のデータが含まれている場合、私は 'OutOfMemory'問題を抱えていますか? –

+0

No. 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 
関連する問題