黑马程序员技术交流社区

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

作者: _王涛    时间: 2013-4-17 18:01
标题: 字节流小问题
本帖最后由 _王涛 于 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原理是什么?

作者: 高梦晓    时间: 2013-4-17 18:06
available()方法 返回的是实际可读字节数,也就是总大小

但是需要注意的是。java虚拟机中的字符是Unicode编码,占两个字符,假如一个txt文档内容为abcde是ASCII码,那么每个字符就是一个字节,所以共5个字节。
注意,class文件中的编码也不是Unicode的,而是utf8的
作者: JavaUtil    时间: 2013-4-17 18:13
本帖最后由 JavaUtil 于 2013-4-17 18:16 编辑

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

好专业嘿嘿
作者: JavaUtil    时间: 2013-4-17 18:20
dongyangzhang 发表于 2013-4-17 18:14
好专业嘿嘿

我也是业余的,只是谈谈自己的看法。




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