黑马程序员技术交流社区

标题: IO方面 [打印本页]

作者: 王广彬    时间: 2012-7-30 00:11
标题: IO方面
在字节输入流中能不能根据文件的大小来开辟数组空间呢?如果有怎么实现啊?
作者: 柯玲    时间: 2012-7-30 00:39
有的,API中InputStream有这样样一个方法: int available()  返回文件中的字节个数
写法类似于:
  1.     public static void main(String[] args) throws IOException{
  2.                 InputStream ins=new FileInputStream("buf.txt");
  3.                 //此处定义一个大小刚刚好的缓冲区,就不用再循环读取
  4.                 byte[] buf=new byte[ins.available()];
  5.                 ins.read(buf);
  6.                 System.out.println(new String(buf));
  7.                 ins.close();
  8.         }
复制代码
但要注意的是:若拷贝一个容量过大的文件,如电影,available()返回的数组长度有可能超过虚拟机的内存容量。一般情况下虚拟机启动时是有默认内存大小的,如超过虚拟机默认内存大小值,会发生内存溢出,所以available()定义数组长度的方法要慎用,最好的方式还是用byte[] buf=new byte[1024*n];
作者: 李菁    时间: 2012-7-30 01:16
FileInputStream fis=new FileINputStream("fos.txt");
byte[] b=new byte[fis.available()];//available方法用老定义一个方法好的缓冲区,这样就可以不用再循环
fis.read(b);
System.out.println(new String(b));
fis.close();

如果不用available定义缓冲区大小,就必须循环读取
FileInputStream fis=new FileInputStream("fos.txt");
byte[] b=new byte[1024];
int length=0;
while((length=fis.read(b))!=-1){
    System.out.println(new String(b,0,length));
}
fis.close();
毕老师的视频里讲的很清楚的。





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