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

© 李东梁 中级黑马   /  2014-3-25 14:03  /  1084 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东梁 于 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. 急!!!
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

4 个回复

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

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

明白了,谢谢哈!
回复 使用道具 举报
学习。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马