public class TestBufferedOutputStream{
  public static void main(String args[])throws IOException{
       BufferedInputStream bi=
           new BufferedInputStream(new FileInputStream("1.txt"));
       byte data[]=new byte[10];
       while(bi.read(data)!=-1){
           for(int i=0;i<data.length;i++){
              System.out.print((char)data[i]);
                                                //怎么结果不对?
           }
       }
            bi.close();
  }
}
1.txt里面的内容是:
1234567890
9876543210
程序最后显示:
1234567890
987654321098765432
我查jdk了,bi.read(data)方法最后是调用了FileInputStream的read(byte[] b,int off,int len);是不?
我对最后结果不明白,怎么多出了?看api也不懂。

解决方案 »

  1.   

    这里API和源码例子
    一个英文的,一个翻译的:
    http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
    http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
      

  2.   

    bi.read(data)仅仅是读取byte而已。注意文本文件中有换行呀。换行也要占用字节的。 你看你的System.out.print((char)data[i]);根本没有打印换行但是最后控制台下却换行了。data数组里包含换行了,这个换行就会占用data数组的空间。
    1.txt包含的字节数并不是20个呀。
      

  3.   

    所以说最后bi.read(data)!=-1共执行了3次,前两次都读取10个字节,单最后一次不是。而最后一次你又是整个输出data数组,data数组却是10个长度的,那就会把第二次执行bi.read(data)!=-1遗留的数据给输出来了。
      

  4.   

    第四此读到的是空 即返回的时-1 所以终止运行楼主用 read(byte[])的时候要注意下,当最有取到的字节数大于0的时候,也算是取到了值,覆盖byte[]的时候会覆盖取到的部分,没有覆盖的部分仍然时上次取到的内容
      

  5.   

    要么一个一个字节读 要么用BufferedReader的readLine() 就能避免啦.