readline 忽略文件中的 \n 或 \r(文本与二进制)

readline ignores \n or \r in files (text vs binary)

我的想法有一个结...我将 int 0 写入文件三次,每次后跟一个行尾指示符(我试过 \n (0x0A) 和 \r (0x0D) ).这是文件的内容,以字节为单位

00 00 00 00 0D 00 00 00 00 0D 00 00 00 00 0D

为了读回它,我包装了一个

FileInputStream is = new FileInputStream(theFile);
BufferedReader br = new BufferedReader(new InputStreamReader(is));

然而,我第一次打电话给

String s = br.readLine();

读取到文件末尾(位置 15),而不是像我希望的那样停在位置 5(即 0x0D)。有人看到我在哪里误解了事情的运作方式吗?非常感谢。

根据下面的评论添加了信息:代码是

public class TestApp4 {
  public static void main(String args[]) {
    try {
        File theFile = new File("Test.dat");
        FileInputStream is = new FileInputStream(theFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        System.out.println("input stream position: " + is.getChannel().position());
        String s = br.readLine();
        byte[] bs = s.getBytes();
        int i = ByteBuffer.wrap(bs).getInt();
        System.out.println("input stream position: " + is.getChannel().position());
        System.out.println("line: " + i);
        s = br.readLine();
        System.out.println("line: ");
        s = br.readLine();
        System.out.println("line: ");
        br.close();
    } catch (Throwable e) { e.printStackTrace(); }
  }
}

我从中得到的输出是

input stream position: 0
input stream position: 15
line: 0
line: 
line: 

我知道我错在哪里了。每个

br.readLine();

在应有的地方中断。我的困惑源于

is.getChannel().position()

前进到文件末尾而不是行尾。我误解了这个值代表读入字符串的最后位置——这显然是不正确的。看起来这是读入更大流的位置。感谢您帮助解决我的问题。

InputStreamReaderBufferedReader 都有他们的内部缓冲区,他们在做任何其他事情之前填充它们。因此,如果您调用 BufferedReader#readLine,将会读入比第一个换行符之前的字符更多的数据。由于 类 都使用数千字节 (InputStreamReader) 和字符 (BufferedReader) 范围内的缓冲区进行操作,因此它会在您第一次调用时立即到达 15 字节长文件的末尾那个方法。

至少当你写 "reads to the end of the file" 时我是这么读的。如果我猜错了,请问一个更准确的问题(最好用一些代码来说明你在做什么,而我们这边需要解释)