5

ファイルを1行ずつ読みたい。BufferedReader は、RandomAccessFile または BufferedInputStream よりもはるかに高速です。しかし問題は、読み取ったバイト数がわからないことです。読み取ったバイト数(オフセット)を知る方法は? 私は試した。

String buffer;
int offset = 0;

while ((buffer = br.readLine()) != null)
    offset += buffer.getBytes().length + 1; // 1 is for line separator

ファイルが小さい場合は機能します。ただし、ファイルが大きくなると、オフセットは実際の値よりも小さくなります。オフセットを取得するにはどうすればよいですか?

4

5 に答える 5

8

BufferedReader文字のエンコーディングと行末という 2 つの影響があるため、これを行う簡単な方法はありません。Windows では、行末\r\nは 2 バイトです。Unix では、行区切りは 1 バイトです。BufferedReader気付かないうちに両方のケースを処理するため、 の後readLine()、スキップされたバイト数はわかりません。

またbuffer.getBytes()、デフォルトのエンコーディングとファイル内のデータのエンコーディングがたまたま同じである場合にのみ、正しい結果が返されます。byte[]どのような種類の<->String変換を使用する場合でも、使用するエンコーディングを常に正確に指定する必要があります。

InputStreamバッファリングされたリーダーはデータを大きなチャンクで読み取るため、カウントも使用できません。したがって、たとえば 5 バイトで最初の行を読み取った後、内部のカウンターはInputStream4096 を返します。これは、リーダーが常にそのバイト数を内部バッファーに読み取るためです。

これについては、NIO を参照してください。低レベルByteBufferを使用してオフセットを追跡し、それをラップしCharBufferて入力をラインに変換できます。

于 2013-02-26T15:43:37.237 に答える
0

使ってみるRandomAccessFile

     RandomAccessFile raf = new RandomAccessFile(filePath, "r");
     while ((cur_line = raf.readLine()) != null){
        System.out.println(curr_line);
        // get offset
        long rowIndex = raf.getFilePointer();
     }

オフセットでシークするには:

raf.seek(offset);

于 2019-01-02T14:18:31.357 に答える
-3

ファイルを 1 行ずつ読みたい場合は、次のコードをお勧めします。

import java.io.*;
class FileRead 
{
 public static void main(String args[])
  {
  try{
  // Open the file that is the first 
  // command line parameter
  FileInputStream fstream = new FileInputStream("textfile.txt");
  // Use DataInputStream to read binary NOT text.
  BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
  String strLine;
  //Read File Line By Line
  while ((strLine = br.readLine()) != null)   {
  // Print the content on the console
  System.out.println (strLine);
  }
  //Close the input stream
  in.close();
    }catch (Exception e){//Catch exception if any
  System.err.println("Error: " + e.getMessage());
  }
  }
}

私はいつもその方法を過去に使用していましたが、うまくいきました!

出典:こちら

于 2013-02-26T15:30:38.767 に答える