2011-06-20 107 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