Java MyBufferedInputStream有什么问题?

Java MyBufferedInputStream有什么问题?,java,android,file,Java,Android,File,我需要逐行处理文件,并想知道行的开始偏移量。 因为BufferedInputStream中没有读线,所以我编写了自己的读线。 除了补偿外,它工作正常。当文件长度变长时,偏移量返回不正确的值。 我的代码有什么问题 class MyBufferedInputStream extends BufferedInputStream { long offset = 0; public MyBufferedInputStream(InputStream in) { super

我需要逐行处理文件,并想知道行的开始偏移量。 因为BufferedInputStream中没有读线,所以我编写了自己的读线。 除了补偿外,它工作正常。当文件长度变长时,偏移量返回不正确的值。 我的代码有什么问题

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

当您读取数据并在最后关闭缓冲区时,您需要刷新,一些数据可能仍在内存中,从而产生冲突,这就是为什么它不能正确运行的原因,您有时会看到结果,有时不会看到结果。

正如Pescis在评论中建议的那样,您应该使用
BufferedReader
读取文本行,而不是扩展
BufferedInputStream
并添加自己的
readLine()
方法

Java有两种I/O类:streams和Reader/Writer

java.io.InputStream
java.io.OutputStream
以及扩展它们的所有内容)用于读取二进制数据(字节)

读卡器写卡器
java.io.Reader
java.io.Writer
)用于读写文本;它们包含使用字符编码将字符从字节转换为字节的逻辑

请注意,在代码中,您使用
新字符串(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();
  • 若该行的长度超过256字节的缓冲区,则会出现溢出
  • 如果最后一行不以换行符结尾,则不会返回(返回null)
  • 如果在经过10个字节后找到一个
    \n
    ,则返回一个长度为256的新字符串,其中前10个字符是行,246个字符
    \0
    。换句话说,无论行有多长,您总是为每行返回256个字符的字符串

  • 您不使用
    新的BufferedReader(新的InputStreamReader(stream))
    ,然后在缓冲读取器上调用
    readLine
    的原因是什么

    BufferedReader
    有一个
    readLine()
    -我建议您使用它。为什么不使用BufferedReader?我知道。它不是比BufferedInputStream慢吗?@user1301568-总是喜欢使用标准库而不是重新发明轮子!为什么要重新设计DataInputStream.readLine?我想知道行开始的偏移量。使用BufferedReader是否知道偏移量?否。但是,不使用读取器(即在流上实现读取器)意味着您使用的是字节而不是字符,这意味着您必须提供自己的编码逻辑。您应该实现自己的BufferedReader,而不是自己的BufferedInputStream。如果你这样做了,你应该注意我上面提到的错误。