0

我的想法有一个结......我将 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()

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

4

1 回答 1

0

InputStreamReader并且BufferedReader在做任何其他事情之前都有自己的内部缓冲区。因此,如果您调用BufferedReader#readLine更多的数据,则将读取更多的数据,而不仅仅是第一个换行符之前的字符。由于这两个类都使用数千字节 ( InputStreamReader) 和字符 ( BufferedReader) 范围内的缓冲区进行操作,因此在您第一次调用该方法时,它会立即到达 15 字节长文件的末尾。

至少当你写“读取到文件末尾”时我读到的就是这个。如果我猜错了,请问一个更准确的问题(最好用一些代码来显示你在做什么离开并且我们这边需要解释)

于 2017-09-05T14:58:43.133 回答