2011-06-20 5 views
4

私は、ファイルから最後のレコードを読んだとき知ってできるようにする必要があります(別の言い方をする、または読み込みがEOFを返しますとき、私が知っている必要があります)。私は、先読みして1深度のキューを維持しようとするのではなく、現在のファイル位置を取得することでこれを判断することをお勧めします。Javaで順次読み込み中に現在のファイル位置を取得するにはどうすればよいですか?

以下は、私がいる問題を示しています。残念ながら、それはmyFileChannel.positionは()バッファに読み込まれていない最初の位置にオフセット私に言っているように見えることが判明たとえば、最初のreadline()の後にposition()は8192を返します。

readline()で使用されていない最初の文字のオフセットを取得する方法はありますか?

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.nio.channels.FileChannel; 

public final class FilePosition { 

    public static void main(String[] args) { 
     String   myFileName = args[0]; 
     File    myFile; 
     FileInputStream myInputStream; 
     InputStreamReader myInputStreamReader; 
     FileChannel  myFileChannel; 
     BufferedReader myBufferedReader; 
     long    myFileSize; 
     long    myFilePosition; 

     String absDirPath = "/Users/chap/Documents/workspace/FilePosition/bin/"; 
     myFileName = args[0]; 

     try { 
      myFile    = new File(absDirPath + myFileName); 
      myInputStream  = new FileInputStream(myFile); 
      myInputStreamReader = new InputStreamReader(myInputStream); 
      myBufferedReader = new BufferedReader(myInputStreamReader); 

      myFileChannel = myInputStream.getChannel(); 
      myFileSize = myFileChannel.size(); 

      String inputLine = ""; 
      while (inputLine != null) { 
       inputLine = myBufferedReader.readLine(); 
       // myFilePosition = ? 
       myFilePosition = myFileChannel.position(); 
       say(inputLine + " Size=" + myFileSize + ", Pos=" + myFilePosition); 
      } 

     } 
     catch (Exception e) { 
      say("Exception caught opening file " + 
        myFileName + ": " + e.getMessage()); 
      return; 
     } 
    } 

    private static void say(String s) { 
     System.out.println(s); 
    } 
} 

答えて

0

ファイル全体のサイズを事前に取得するようなことがあります。そして、あなたがそれを読んでいるとき(行ごとに表示されるかもしれません)、あなたがどれくらい行ったかを計算してください。あなたに実現可能かどうかは分かりませんが、ちょっと考えました。

+0

私はmyFileChannel.sizeを使用してファイル全体のサイズ、()..(*その*何であるかについての驚きがあることが判明していない限り)を持っています。各入力行の長さのランニング・タリーを維持することは私の後退の位置です。行区切り文字の長さを把握する必要がないため、理想的ではありません。 – Chap

関連する問題