7

RandomAccessFile を使用して、ファイル内の特定の行の先頭にカーソルを配置することは可能ですか?

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

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

アップデート:

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

行の長さは 200 文字です (間違いがなければ 200 バイトです)

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

どこが間違っていますか?

4

4 に答える 4

4

よくわかりませんが、 RandomAccessFile はそのような機能をサポートしていないようです。RAF はバイト単位で動作するため、特定のバイト数をスキップできます。ファイルの行幅が固定されている場合、これは次の方法で実現できます。

file.skipBytes(110 * lineSizeInBytes);

それ以外の場合は、次のようなものが必要です。

for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();
于 2012-03-19T12:21:48.623 に答える
3

で直接これを行うことはできませんRandomAccessFileバイナリ ファイルの操作に対応しており、任意のランダムな場所でそのようなファイル フラグメントを読み書きするのに役立ちます。これが、クラスが と呼ばれる理由RandomAccessFileです。

ただし、テキストでは機能しないため、行末を認識する方法がなく、行に関してはまったく機能しません。

したがって、使用する必要があるものを実装するにはBufferedReader、行ごとに読み取り、各行の開始位置を保存する場合は、必要な行の先頭にジャンプするために必要なバイト数をスキップできます。

于 2012-03-19T12:18:41.383 に答える
1

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

于 2012-03-19T12:23:10.653 に答える
1

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

簡単な例は...

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 のようなものを使用できる場合は、これらすべての問題を自動的に処理するため、代わりにそれを使用することをお勧めします。

于 2012-03-19T12:56:56.150 に答える