0

ランダム アクセス ファイルを作成し、そこに情報を書き込みます。ランダム アクセス ファイルの各行の位置を配列に格納したいと考えています。ランダム アクセス ファイルのすべての行を指すインデックスを作成します。したがって、ランダムアクセスファイルの行の位置をインデックスに保存する必要があります。

私のプログラムは次のとおりです

package randomaccessfile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class raf {

   public static void main(String[] args) throws FileNotFoundException, IOException {
      File file = new File("DocumentsFile.txt");
      RandomAccessFile raf = new RandomAccessFile(file, "rw");
      for (int i = 0; i <= 10 ; i++) {
         String sentence = "1 Info Name Surname"; //i create sentences in the random access file
         raf.seek(file.length());
         raf.writeBytes(sentence);
         raf.writeBytes("\r\n");
      }
      raf.close();
   }
}

ランダム アクセス ファイルに作成された行ごとに、その位置を配列に格納したいと思います。

位置はインデックスに格納されます。

ランダム アクセス ファイル内の行の位置を返すために使用できる方法はありますか?

4

3 に答える 3

5

RandomAccessFile必要なものはすべて提供されています。

1 つには、ここでは必要ありませんseek()。ファイル ポインターは、各書き込み操作でファイルに書き込まれたバイト数を超えて進みます。

これは、 line を書き込んだ後n、 の値に関係なく、オブジェクトからnの結果を取得すると、 line の開始オフセットが得られることを意味します。行 1 はオフセット 0 から始まります。ここで実際に考慮しなければならないのは、これだけです。.getFilePointer()RandomAccessFilen+1

于 2011-12-23T22:09:50.467 に答える
0

一時変数を使用して、最後の FilePointer を格納できます。readline を反転する必要がある場合は、この変数を使用してリーダー ポインターを設定できます。

RandomAccessFile myReader = new RandomAccessFile(fileObject, "r");    
long current_postion = myReader.getFilePointer();
myReader.readLine();
if (line should be reversed){
   myReader.seek(current_postion); //Point to the previous line
}
于 2021-10-27T14:52:27.313 に答える
0

一方、本当に気にするのが行番号である場合は、LineNumberReader を使用して、書き込まれたファイルのすべての行を特定の行番号にマップできます。

File file = new File("jedi.txt");

try(LineNumberReader lnr = new LineNumberReader(new FileReader(file))){
    String line = null;

    while ( (line = lnr.readLine()) != null){
        System.out.println(lnr.getLineNumber() + " " + line );
    }
}catch(IOException e){
    e.printStackTrace();
}

もちろん、これは RandomAccessFiles とは何の関係もありませんが、何をしているかによっては別の方法になる可能性があります。

于 2011-12-23T22:31:35.677 に答える