0

テキストファイルに存在するすべての行のオフセットを知りたい。

今のところ私は試しました、

path=FileSystems.getDefault().getPath(".",filename);
br=Files.newBufferedReader(path_doc_title_index_path, Charset.defaultCharset());
int offset=0; //offset of first line.       
String strline=br.readline();
offset+=strline.length()+1; //offset of second line

このようにして、ファイル全体をループして、テキストファイル全体の行頭のオフセットを知ることができます。しかし、RandomAccessFile上記の方法で計算されたオフセットを使用してファイルをシークし、行にアクセスするために使用する場合、私はある行の真ん中にいることに気づきました。つまり、オフセットが正しくないようです。

どうしたの?この方法はオフセットを計算するのに正しくありませんか?より良い高速な方法はありますか?

4

2 に答える 2

1

コードは、ASCII エンコードされたテキストに対してのみ機能します。一部の文字は 1 バイト以上を必要とするため、次の行を変更する必要があります。

offset += strline.length() + 1;

offset += strline.getBytes(Charset.defaultCharset()).length + 1;

質問の下の私のコメントで述べたように、ファイルの正しいエンコーディングを指定する必要があります。たとえばCharset.forName("UTF-8")、ここと、初期化する場所ですBufferedReader

于 2013-02-09T22:15:37.237 に答える
0

どうやら、これは私に期待される結果を与えます。次のプログラムでは、BufferedReader で収集した一連のオフセットを使用して、ファイルの各行を出力します。これはあなたの場合ですか?

public static void main(String[] args) {
    File readFile = new File("/your/file/here");
    BufferedReader reader = null;
    try
    {
        reader = new BufferedReader( new FileReader(readFile) );
    }
    catch (IOException ioe)
    {
        System.err.println("Error: " + ioe.getMessage());     
    }
    List<Integer> offsets=new ArrayList<Integer>(); //offset of first line.       
    String strline;
    try {
        strline = reader.readLine();
        while(strline!=null){
            offsets.add(strline.length()+System.getProperty("line.separator").length()); //offset of second line
            strline = reader.readLine();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        RandomAccessFile raf = new RandomAccessFile(readFile, "rw");
        for(Integer offset : offsets){
            try {
                raf.seek(offset);
                System.out.println(raf.readLine());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}
于 2013-02-09T22:15:00.357 に答える