Java MyBufferedInputStream有什么问题?
我需要逐行处理文件,并想知道行的开始偏移量。 因为BufferedInputStream中没有读线,所以我编写了自己的读线。 除了补偿外,它工作正常。当文件长度变长时,偏移量返回不正确的值。 我的代码有什么问题Java MyBufferedInputStream有什么问题?,java,android,file,Java,Android,File,我需要逐行处理文件,并想知道行的开始偏移量。 因为BufferedInputStream中没有读线,所以我编写了自己的读线。 除了补偿外,它工作正常。当文件长度变长时,偏移量返回不正确的值。 我的代码有什么问题 class MyBufferedInputStream extends BufferedInputStream { long offset = 0; public MyBufferedInputStream(InputStream in) { super
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();
\n
,则返回一个长度为256的新字符串,其中前10个字符是行,246个字符\0
。换句话说,无论行有多长,您总是为每行返回256个字符的字符串您不使用
新的BufferedReader(新的InputStreamReader(stream))
,然后在缓冲读取器上调用readLine
的原因是什么 BufferedReader
有一个readLine()
-我建议您使用它。为什么不使用BufferedReader?我知道。它不是比BufferedInputStream慢吗?@user1301568-总是喜欢使用标准库而不是重新发明轮子!为什么要重新设计DataInputStream.readLine?我想知道行开始的偏移量。使用BufferedReader是否知道偏移量?否。但是,不使用读取器(即在流上实现读取器)意味着您使用的是字节而不是字符,这意味着您必须提供自己的编码逻辑。您应该实现自己的BufferedReader,而不是自己的BufferedInputStream。如果你这样做了,你应该注意我上面提到的错误。