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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王广彬 中级黑马   /  2012-7-30 00:11  /  1927 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在字节输入流中能不能根据文件的大小来开辟数组空间呢?如果有怎么实现啊?

2 个回复

倒序浏览
有的,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];

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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();
毕老师的视频里讲的很清楚的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马