2013-02-26 59 views
5

我想逐行讀取文件。 BufferedReader比RandomAccessFile或BufferedInputStream快得多。 但問題是我不知道我讀了多少字節。 如何知道字節讀取(偏移量)? 我試過了。如何知道BufferedReader的字節讀取(偏移量)?

String buffer; 
int offset = 0; 

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

我工作,如果文件很小。 但是,當文件變大時,偏移量變得比實際值小。 如何獲得抵消?

+0

你想實現什麼樣的更大的任務?由於內部緩衝區(以及編碼和不同的行尾),這基本上很棘手。 – 2013-02-26 15:27:19

+0

我想獲得行首的偏移量。所以,我稍後使用偏移量來使用RandomAccessFile讀取文件的某些部分。 – user1301568 2013-02-26 15:31:15

+0

假定只有一行分隔符字節,例如\ n。你能假設嗎? – EJP 2013-02-26 23:55:06

回答

-3

如果你想逐行讀取一個文件行,我會推薦這代碼:

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()); 
    } 
    } 
} 

我總是用過去那種方法,和偉大工程!

來源:Here

+2

你的回答有點不對,因爲你應該關閉finally塊中的外部資源,你也不回答這個問題,除此之外他使用的是類似的東西,但是使用更簡潔的代碼示例。 – comanitza 2013-02-26 15:41:57

+0

如果它來自印度玫瑰,你應該認爲它只是大部分是正確的。你最好閱讀任何其他網站。 – 2013-12-17 10:26:03

8

有沒有簡單的方法與BufferedReader因爲兩方面的影響要做到這一點:字符endcoding和行結尾。在Windows上,行尾是\r\n,這是兩個字節。在Unix上,行分隔符是單個字節。 BufferedReader將處理這兩種情況,而您沒有注意到,所以在readLine()之後,您將不知道跳過了多少個字節。

另外buffer.getBytes()僅當您的默認編碼和文件中的數據編碼意外相同時才返回正確的結果。當使用任何種類的byte[] < - >String轉換時,應該總是使用指定應使用哪種編碼。

您也不能使用計數InputStream,因爲緩衝讀取器以大塊讀取數據。因此,在讀取第一行(例如5個字節)之後,內部InputStream中的計數器將返回4096,因爲閱讀器總是將很多字節讀入其內部緩衝區。

你可以在這裏看看NIO。您可以使用低級別ByteBuffer來跟蹤偏移並將其包裝在CharBuffer中以將輸入轉換爲行。

+0

有沒有簡單的方法來做到這一點與BufferedReader,因爲它既緩衝和新行檢測。順便說一句,感謝提供關於ByteBuffer和CharBuffer – 2017-05-02 16:32:37

0

我想知道你的最終解決方案,但是,我認爲使用long類型而不是int可以滿足上面代碼中的大多數情況。

相關問題