黑马程序员技术交流社区
标题:
一个字节流的问题,帮我分析下
[打印本页]
作者:
灵感
时间:
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说的如下:
available
public int
available
() throws
IOException
返回可以不受阻塞地从此输入流读取的字节数。 BufferedInputStream 的 available 方法返回缓冲中尚未读取的字节数(count - pos)和调用基础输入流的 available 方法所得结果的和。
覆盖:
类
FilterInputStream
中的
available
返回:
可以不受阻塞地从此输入流读取的字节数。
抛出:
IOException
- 如果发生 I/O 错误。
另请参见:
FilterInputStream.in
我的理解是
:
available方法不是将所有的字符装进缓冲区计算,然后再将字节数返回,而是根据系统文件的描述返回文件的大小,至于那个封闭式,还是等下一个哥们来吧,不是很理解~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2