2017-09-05 108 views
0

我在我的想法中有一个结...我将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。

+0

你究竟是什么意思“读到文件末尾“?你是否暗示'readLine'返回完整的String而不是单行? – Lothar

+0

是什么让你觉得它不会停在行尾?不知道你为什么要将二进制数据读入一个字符串,但我只是试过,它只读取第一行。请张贴更多你的代码。 – Oleg

回答

0

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

至少这是我在写入“读到文件末尾”时读入的内容。如果我猜错了,请提出一个更精确的问题(理想情况下用一些代码显示你正在做什么离开,需要我们解释)

+0

谢谢你一堆Lothar,你完全在钱上。 –