黑马程序员技术交流社区

标题: 字节流问题 [打印本页]

作者: 李东梁    时间: 2014-3-25 14:03
标题: 字节流问题
本帖最后由 李东梁 于 2014-3-25 16:48 编辑
  1. public static void readFile2() throws IOException {
  2.                
  3.                 FileInputStream fis = new FileInputStream("temp\\fos.txt");
  4.                
  5. //                System.out.println(fis.available());//获取文件的字节数。
  6. //                byte[] buf = new byte[fis.available()];//以它作为缓冲区的长度是不合适,容易造成内存溢出
  7. //                fis.read(buf);
  8. //                System.out.println(new String(buf));
  9.                 //创建一个缓冲区。缓冲读到的字节。
  10.                 byte[] buf = new byte[1024];
  11.                 int len = 0;
  12.                 while((len=fis.read(buf))!=-1){
  13.                         System.out.println(new String(buf,0,len));
  14.                 }
  15.                
  16.                 fis.close();
  17.         }

  18. 上面讲到不能用fis.available();做为缓冲区的长度,应为是内存溢出。

  19. 这个内存是什么内存?
  20. byte[] buf = new byte[fis.available()];
  21. byte[] buf = new byte[1024];
  22. 这两个有什么区别?
  23. 急!!!
复制代码


作者: 李东梁    时间: 2014-3-25 15:34
zengming13 发表于 2014-3-25 14:15
fis.available()返回的是下一次能不受限制地一次性读出的字节数,由于文件的大小有可能大于系统内存,而不 ...

那么如果读取的文件很大,会大于系统内存,创建一个缓存器一次一次的读,读到到最后不还是要大于系统内存,这样又于用fis.available()有什么区别呢?
作者: 也许依然    时间: 2014-3-25 16:25
available方法返回的是不受阻塞一次性读取的字节数,可以返回读取文件所有的字节数,字节流可以操作媒体文件,当一次性读取文件时,文件的大小可能大于虚拟机分配的容量,也可能大于内存的容量,这样就出现了内存溢出。
当使用byte[] buf = new byte[1024];时,这是自定义的缓冲区,一次最多只能读取1024字节的数据,当文件比较大时,需要循环读取,一般建议使用这种方法,这是最优化的选择
作者: 李东梁    时间: 2014-3-25 16:47
李东梁 发表于 2014-3-25 15:34
那么如果读取的文件很大,会大于系统内存,创建一个缓存器一次一次的读,读到到最后不还是要大于系统内存 ...

明白了,谢谢哈!
作者: eternallove    时间: 2014-3-25 17:11
学习。。。




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