2012-03-19 15 views
6

RandomAccessFileを使用してファイル内の特定の行の先頭にカーソルを置くことはできますか?RandomAccessFileを使用して特定の行にファイルを移動する

ファイル内の111行目のchar 10から20までの文字列を変更したい。ファイルには、固定長レコードがあります。

RandomAccessFileを使用して、行111の先頭にカーソルを直接配置することはできますか?

更新:

次のコードを使用しました。しかし、nullを返します。

ラインの長さは、どこが間違っているつもりです

File f = new File(myFile); 
RandomAccessFile r = new RandomAccessFile(f,"rw"); 
r.skipBytes(200 * 99); // linesize * (lineNum - 1) 
System.out.println(r.readLine()); 

(私は間違っていないよ場合は200バイト)200の文字?

答えて

3

確かに分かりませんが、RandomAccessFileはそのような機能をサポートしていないようです。 RAFはバイトで動作すると私たちはバイトの具体的な金額をスキップすることができ、そして、あなたのファイルは、これがそうでない場合

file.skipBytes(110 * lineSizeInBytes); 

することによって達成することができ、線幅を固定している場合、あなたはこのようなものが必要ですへ

for (int i = 0; i < 110; i++) file.readLine(); 
String line = file.readLine(); 
+0

私は固定長のレコードを持っています....それが動作するかどうかをチェックさせてください.. – Nik

+0

私の更新された質問を参照してください..どこが間違っていますか? – Nik

+0

各行に\ n文字が含まれています。実際には、lineCount *(lineSize + 1)をスキップする必要があります。 – mishadoff

2

RandomAccessFileで直接行うことはできません。バイナリファイルを扱う際には、ランダムの場所でそのようなファイルを読み書きするのに役立ちます。これは、クラスがRandomAccessFileと呼ばれる理由です。

しかし、テキストでは機能しないので、行の終わりを認識する方法はなく、行に関しては全く機能しません。

BufferedReaderを使用する必要がある場合は、行単位で読み込みを行い、各行の開始位置を保存したい場合は、必要なバイト数をスキップして先頭にジャンプすることができます必要な行の

+0

+1しかし、OPはファイルに固定長のレコードがあると後ろにコメントしました。 –

+0

@Andrew Thompson、あなたは正しいです。私はこの細部に注意を払わなかった。 – AlexR

+0

いいえ、あなたの回答が投稿された後にのみ言及されました*。私はそれをさらに混乱を避けるために編集しました。 –

1

をRandomAccessFileを使うと、固定長のレコードを持つか、または各レコードの先頭にオフセットの "ドープベクトル"を付ける必要があります(たとえば、10番目のレコードごと)。これらはあなたの問題に適しているかもしれません。

1

他の人が述べているように、BufferedReaderなどのテキスト行を読み込むように特別に設計されたクラスがあります。あなたがたRandomAccessFileを使用する必要がある場合は、テキストの行を読み込むことができますが、プログラムで1本のラインが終了し、別の行が始まる...

簡単な例は...

RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r"); 
String line = ""; 
while (raf.available()){ 
    byte b = raf.read(); 
    if (b == '\n'){ 
    // this is the end of the current line, so prepare to read the next line 
    System.out.println("Read line: " + line); 
    line = ""; 
    } 
    else { 
    line += (char)b; 
    } 
    } 
かもしれ見つける必要があります

これは、各行の終わりを探すリーダの基本的なビルディングブロックを提供します。あなたがのRandomAccessFileを使用しての道を行くつもりならば

、あなたはこのフレームワークで始めることができますが、多くの欠点を認識する必要がありますとなっ屋さんなど...など 1. UnixとWindowsの使用異なるラインマーカー - '\ n'、 '\ r'、およびこれらの両方の組み合わせを探す必要があります 2。一度に1バイトずつ読むのは非常に遅いです。バイトブロックを配列バッファ(たとえばバイト[2048]配列)に読み込んだ後、配列を繰り返して、最後に到達するとRandomAccessFileから配列を補充する必要がありますバッファ配列 3. Unicode文字を扱う場合は、1バイトではなく、一度に2バイトを読み込んで処理する必要があります。

のRandomAccessFileは非常に強力ですが、あなたはBufferedReaderのようなものを使用することができるならば、あなたはおそらく、それが自動的にすべてのこれらの問題の世話をするように、代わりにそれを使用するためにはるかに良いと思います。