0

固定フォーマットのファイルがあります。

行番号に基づいて、このファイルの特定の行にアクセスしたいと思います。

例:100行目を読む

各行の長さは200バイトです。

したがって、RandomAccessFileを使用してカーソルを100行目に直接移動すると、次のようになります。

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

ただし、出力がnullになっています。

ここで何が欠けていますか?

質問は私の前の質問に答えるために続けられていますRandomAccessFileを使用してファイルの特定の行に到達する

アップデート:

以下のプログラムは、私が期待しているとおりに機能します。

行サイズは200文字です。

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

行番号(ファイル全体の任意の行番号)を指定すると、その行が印刷されます。

@EJP:説明してください!

4

4 に答える 4

1

まず、ファイルに書き込むのではなく、ファイルから読み取るだけの場合は、RandomAccessFileを「rw」ではなく「r」として開くことをお勧めします。その理由は、ファイルが書き込みアクセスを許可するために開いている場合、ファイルを必要なだけ大きく書き込むことができる可能性があるため、実際にはファイル内のポインターをファイルの長さよりも大きい場所に移動できるためです。

たとえば、長さが100バイトのファイルがある場合、そのファイルを読み取り専用モードで開くと、ポインターをそれらの100バイトのどこかに保持する必要があります。ただし、同じファイルを読み取り/書き込みモードで開くと、RandomAccessFileにseek(250)を指示でき、ファイルのこの時点でデータを書き出す可能性があると考えられるため、問題なく従います。

したがって、他の人が述べているように、ファイルの終わりを超えて移動した可能性があります。これは、「rw」モードでは非常に有効です。

次に、ファイルの先頭から読み取る場合は、skipBytes()ではなくseek()を使用することをお勧めします。seek()を使用することにより、ファイルの先頭に常に相対的であるため、目的の正確な場所に移動することが保証されます。ただし、skipBytes()はファイル内の現在のポインター位置を基準にしているため、RandomAccessFileコンストラクターとskipBytes()メソッド呼び出しの間で誤ってポインターをコード内のどこかに移動した場合、正しい場所に到達できません。 。

したがって、ファイルの最初から作業する場合、seek()は、RandomAccessFileに対して他に何をしても、ファイル内の正しい場所に到達するという、より高いレベルのセキュリティを提供します。

于 2012-03-20T12:31:14.023 に答える
1

RandomAccessFile.readLine()ファイルの最後で null を返します。Javadoc にあるように。

したがって、ファイルの終わりにいます。

したがって、そうでないと言うあなたの計算は正しくありません。

于 2012-03-20T09:49:42.813 に答える
0

EJPが言ったことは正しいです: http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html

  • ファイルを修正する必要があることを確認します。存在しないファイルで RandomAccessFile を作成すると、例外がスローされます。例外がないため、A ファイルを使用して RandomAccessFile を作成しました。それが正しいものであることを確認してください。
  • RandomAccessFile は、内部ファイル位置ポインターを利用します。すでにファイルの最後にいて、再びいくつかのバイトをスキップすると、あなたが言及した動作が説明されます。ファイル内の正しい位置にいることを確認してください。
于 2012-03-20T10:43:42.313 に答える
-1
byte[] line = new byte[200];
r.seek(200 * 99);
r.read(line);
String s = new String(line, "UTF-8"); // Or probably "Cp1252"
于 2012-03-20T09:13:17.633 に答える