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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _王涛 中级黑马   /  2013-4-17 18:01  /  1620 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 _王涛 于 2013-4-18 09:46 编辑

public static void readFile_2()throws IOException{
  FileInputStream fis=new FileInputStream("f:\\java.txt");
  int a=fis.available();
  byte[] buf=new byte[a];
  fis.read(buf);
  System.out.println(new String(buf));
  fis.close();
}
我想问一下,以上代码中调用了available()方法,为什么可以省略了循环呢?read方法不是一次读一个字节吗?
有点不明白了,求高人指点,available原理是什么?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
available()方法 返回的是实际可读字节数,也就是总大小

但是需要注意的是。java虚拟机中的字符是Unicode编码,占两个字符,假如一个txt文档内容为abcde是ASCII码,那么每个字符就是一个字节,所以共5个字节。
注意,class文件中的编码也不是Unicode的,而是utf8的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 JavaUtil 于 2013-4-17 18:16 编辑

平时需要循环,是因为我们不知道给定的值是否能满足实际需要。给大了浪费空间,给小了只是多循环几次就好了,当然也不能太小。而你用available()方法,得到了准确的大小,就不需要再循环了。不过你这样做有一个弊端,如果文件足够大,你的虚拟机内存会吃不消的,到时不是传输慢就是抛错。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
JavaUtil 发表于 2013-4-17 18:13
平时需要循环,是因为我们不知道给定的值是否能满足实际需要。给大了浪费空间,给小了只是多循环几次就好了 ...

好专业嘿嘿
回复 使用道具 举报
dongyangzhang 发表于 2013-4-17 18:14
好专业嘿嘿

我也是业余的,只是谈谈自己的看法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马