A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 灵感 高级黑马   /  2012-11-23 21:16  /  1389 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严学韦 于 2012-11-23 21:52 编辑

谁能帮我更透彻地分析一下这两段代码的区别
public static void readFile_1()throws IOException{
        FileInputStream fis = new FileInputStream("fos.txt");
        
        byte[] buf = new byte[fis.available()];(用available()定义一个刚刚好的缓冲区,不用再循环了)
        fis.read(buf);//这里的read()是怎么读的呢?
        System.out.println(new String(buf));
        fis.close();
}

public static void readFile_2()throws IOException{
        FileInputStream fis = new FileInputStream("fos.txt");
        
        byte[] buf = new byte[1024];
        int len = 0;
        while((len=fis.read(buf))!=-1){
                System.out.println(new String(buf,0,len));
        }
        fis.close();
}
难道定义一个刚刚好的缓冲区就不用再循环了吗?是不是字节流的raad()方法是连续读的,所以就不用再用while循环了??

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
用available()定义一个刚刚好的缓冲区时,文件在读取时会一次性全部读取,不用循环的一次一次的读取了,这里的read读取时会一次性读取的。

byte[] buf = new byte[1024];
         int len = 0;
         while((len=fis.read(buf))!=-1)
则是每循环一次就读取1024个字节,每次只能读取一行

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
潘天功 发表于 2012-11-23 21:36
用available()定义一个刚刚好的缓冲区时,文件在读取时会一次性全部读取,不用循环的一次一次的读取了,这 ...

明白了!谢谢
回复 使用道具 举报
我百度了一下这个问题,有一句不太明白
available()这个方法其实是通过文件描述符获取文件的总大小,而并不是事先将磁盘上的文件数据全部读入流中,再获取文件总大小。
既然这个方法不像read()是阻塞式的,为什么能够先读取文件的总大小,而不是先全部写入流中再读取呢?
我擦,在网吧系统里面java的api文档打不开,网吧自己做的系统chm格式的都不支持,要不然我就自己查文档了,有哪位兄弟能顺便解决下这个问题?网上的方法好麻烦而且每次都要上机重新设置{:soso_e113:}
回复 使用道具 举报
api说的如下:
availablepublic int available()              throws IOException返回可以不受阻塞地从此输入流读取的字节数。 BufferedInputStream 的 available 方法返回缓冲中尚未读取的字节数(count - pos)和调用基础输入流的 available 方法所得结果的和。

覆盖:FilterInputStream 中的 available返回:可以不受阻塞地从此输入流读取的字节数。 抛出: IOException - 如果发生 I/O 错误。另请参见:FilterInputStream.in

我的理解是
available方法不是将所有的字符装进缓冲区计算,然后再将字节数返回,而是根据系统文件的描述返回文件的大小,至于那个封闭式,还是等下一个哥们来吧,不是很理解~~

点评

very good!  发表于 2012-11-24 10:49
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马