readline忽略文件中的\ n或\ r(文本与二进制文件)
我在我的想法中有一个结...我将int 0写入文件三次,每个文件后跟行结束符(我有试过\ n(0x0A)和\ r(0x0D))。这里是文件的字节readline忽略文件中的 n或 r(文本与二进制文件)
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()
高级到文件末尾而不是行尾。我误解了这个值代表了读入字符串的最后一个位置 - 这显然是不正确的。看起来像这是读入较大流的位置。感谢帮助理清我的booboo。
InputStreamReader
和BufferedReader
在做其他事情之前都有自己的内部缓冲区。所以,如果你打电话给BufferedReader#readLine
,更多的数据将被读入,而不仅仅是第一个换行符。由于这两个类都使用数千字节(InputStreamReader
)和字符(BufferedReader
)范围内的缓冲区进行操作,因此第一次调用该方法时,它会立即到达15字节长文件的末尾。
至少这是我在写入“读到文件末尾”时读入的内容。如果我猜错了,请提出一个更精确的问题(理想情况下用一些代码显示你正在做什么离开,需要我们解释)
谢谢你一堆Lothar,你完全在钱上。 –
你究竟是什么意思“读到文件末尾“?你是否暗示'readLine'返回完整的String而不是单行? – Lothar
是什么让你觉得它不会停在行尾?不知道你为什么要将二进制数据读入一个字符串,但我只是试过,它只读取第一行。请张贴更多你的代码。 – Oleg