0

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

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

3 回答 3

0

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

于 2013-02-26T12:30:45.887 回答
0

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

Java 有两种用于 I/O 的类:流和读取器/写入器。

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

Readerswriters (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();
于 2013-02-26T12:39:18.090 回答
0
  1. 如果 line 比你的 256 字节缓冲区长,那么你会得到一个溢出
  2. 如果最后一行不以换行符结尾,则不会返回(返回 null)
  3. 如果您\n在经过 10 个字节后找到 a ,那么您将返回一个 256 长度的新字符串,其中前 10 个字符是您的 line 和 246 个字符\0。换句话说,无论该行有多长,您总是为每行返回 256 个字符的字符串。

您不使用new BufferedReader(new InputStreamReader(stream)), 然后调用readLine缓冲阅读器的原因是什么?

于 2013-02-26T14:28:10.187 回答