黑马程序员技术交流社区

标题: 一个字节流的问题,帮我分析下 [打印本页]

作者: 灵感    时间: 2012-11-23 21:16
标题: 一个字节流的问题,帮我分析下
本帖最后由 严学韦 于 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循环了??


作者: 潘天功    时间: 2012-11-23 21:36
用available()定义一个刚刚好的缓冲区时,文件在读取时会一次性全部读取,不用循环的一次一次的读取了,这里的read读取时会一次性读取的。

byte[] buf = new byte[1024];
         int len = 0;
         while((len=fis.read(buf))!=-1)
则是每循环一次就读取1024个字节,每次只能读取一行
作者: 灵感    时间: 2012-11-23 21:52
潘天功 发表于 2012-11-23 21:36
用available()定义一个刚刚好的缓冲区时,文件在读取时会一次性全部读取,不用循环的一次一次的读取了,这 ...

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

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

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





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2