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()
前进到文件末尾而不是行尾。我误解了这个值代表读入字符串的最后位置——这显然是不正确的。看起来这是读入更大流的位置。感谢您帮助解决我的问题。
InputStreamReader
和 BufferedReader
都有他们的内部缓冲区,他们在做任何其他事情之前填充它们。因此,如果您调用 BufferedReader#readLine
,将会读入比第一个换行符之前的字符更多的数据。由于 类 都使用数千字节 (InputStreamReader
) 和字符 (BufferedReader
) 范围内的缓冲区进行操作,因此它会在您第一次调用时立即到达 15 字节长文件的末尾那个方法。
至少当你写 "reads to the end of the file" 时我是这么读的。如果我猜错了,请问一个更准确的问题(最好用一些代码来说明你在做什么,而我们这边需要解释)
我的想法有一个结...我将 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()
前进到文件末尾而不是行尾。我误解了这个值代表读入字符串的最后位置——这显然是不正确的。看起来这是读入更大流的位置。感谢您帮助解决我的问题。
InputStreamReader
和 BufferedReader
都有他们的内部缓冲区,他们在做任何其他事情之前填充它们。因此,如果您调用 BufferedReader#readLine
,将会读入比第一个换行符之前的字符更多的数据。由于 类 都使用数千字节 (InputStreamReader
) 和字符 (BufferedReader
) 范围内的缓冲区进行操作,因此它会在您第一次调用时立即到达 15 字节长文件的末尾那个方法。
至少当你写 "reads to the end of the file" 时我是这么读的。如果我猜错了,请问一个更准确的问题(最好用一些代码来说明你在做什么,而我们这边需要解释)