2013-02-26 35 views
0

我需要逐行處理文件,並想知道行開始的偏移量。 因爲BufferedInputStream中沒有readLine,所以我編寫了自己的readLine。 它工作正常,但偏移量。當文件長度變長時,偏移返回不正確的值。 我的代碼有什麼問題?MyBufferedInputStream有什麼問題?

class MyBufferedInputStream extends BufferedInputStream { 
    long offset = 0; 

    public MyBufferedInputStream(InputStream in) { 
     super(in); 
    } 

    public String readLine() throws IOException { 
     int b, i = 0; 
     byte[] buf = new byte[256]; 

     while (true) { 
      b = read(); 
      offset++; 
      if (b == -1) 
       return null; 
      else if (b == '\n') 
       return (new String(buf)); 
      else // assume line in not longer than 256 
       buf[i++] = (byte) b; 
     } 
    } 

    public long getOffset() { 
     return offset; 
    } 

    public void resetOffset() { 
     offset = 0; 
    } 
} 
+2

'BufferedReader'有一個'readLine()' - 我建議你使用它。 – ddmps 2013-02-26 12:31:47

+0

你爲什麼不使用BufferedReader? http://developer.android.com/reference/java/io/BufferedReader.html – shazin 2013-02-26 12:32:38

+0

我知道。它不是比BufferedInputStream慢嗎? – user1301568 2013-02-26 12:34:32

回答

0

你需要的時候你讀取數據,並在年底關閉緩衝區,一些數據仍然可以在內存中生成您的衝突刷新,這就是爲什麼它不appropiately運行,你有時有有時沒有看到結果。

0

正如Pescis在評論中建議的,您應該使用BufferedReader來讀取文本行,而不是擴展BufferedInputStream並添加您自己的readLine()方法。

Java有兩種I/O類:流和讀寫器。

java.io.InputStreamjava.io.OutputStream和延伸它們的所有內容)是用於讀取二進制數據(字節)。

讀者作家java.io.Readerjava.io.Writer)是用於讀取和寫入文本;它們包含使用字符編碼將字符從字節轉換爲字節的邏輯。

請注意,在您的代碼中,您正在使用new String(buf)將包含字節的緩衝區轉換爲字符串。由於您沒有指定字符編碼,因此將使用系統的默認字符編碼,這並非總是您想要的。使用BufferedReader

例子:

InputStream in = ...; // Wherever you get an InputStream from 

BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 

String line; 
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 

br.close(); 
0
  1. 如果線比你的256字節的緩衝區不再那麼你會得到一個溢出
  2. 最後一行將不予退還(返回null),如果它不會以換行符結束
  3. 如果您在經過10個字節後發現\n,那麼您將返回一個長度爲256的新字符串,其中前10個字符是您的行,並且有246個字符\0。換句話說,無論線條有多長,您總是會爲每行返回256個字符的字符串。

什麼是您不使用new BufferedReader(new InputStreamReader(stream)),然後在緩衝讀取器上調用readLine的原因是什麼?

+0

我想知道線條起點的偏移量。無論如何知道使用BufferedReader的偏移量? – user1301568 2013-02-27 06:37:21

+0

不可以。但是,不使用閱讀器(即在Stream之上實現此功能)意味着您使用的是字節而不是字符,這意味着您必須提供自己的編碼邏輯。你應該實現你自己的BufferedReader而不是你自己的BufferedInputStream。如果你這樣做,你應該注意我上面提到的錯誤。 – 2013-02-27 08:33:45