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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cro 初级黑马   /  2012-6-2 22:51  /  1742 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么只能复制小文件,复制大文件(比如一个视频文件)报错,即Java heap space,这个问题该怎么修改!求助!

public class CopyFile {

        public static void main(String[] args) throws Exception {
                File f = new File("E:\\word.txt");         // 原始文件
       
                if (f.isFile() == true) {

                        FileInputStream fis = new FileInputStream(f);
                        BufferedInputStream bis = new BufferedInputStream(fis);
                        byte[] buf = new byte[fis.available()];
                        bis.read(buf);
                        bis.close();

                        File f2 = new File("E:\\orrd.txt");         // 复制后的文件
                        FileOutputStream fos = new FileOutputStream(f2);
                        BufferedOutputStream bos = new BufferedOutputStream(fos);
                        bos.flush();        //强制写出
                        bos.write(buf);
                        bos.close();
                       
                } else {
                        System.out.println("这不是个文件!");
                }
        }
}

6 个回复

倒序浏览
本帖最后由 cro 于 2012-6-3 09:39 编辑
黑马11期李项京 发表于 2012-6-2 23:15
fis.available()该方法的意思是文件有多大,就取多少,如果电影太大的,就会造成内存不够,所以会报错。
1 ...


多谢提示!不过楼上这个程序有点小问题!我修改过后的程序:

import java.io.*;

//文件复制
public class CopyFile {

        public static void main(String[] args) throws Exception {
                File f = new File("E:\\move\\ky.rmvb"); // 原始文件

                if (f.isFile() == true) {

                        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
                        System.out.println(bis.available());
                        byte[] buf = new byte[1024];
                        
                        File f2 = new File("E:\\ordrd.txt"); // 复制后的文件
                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f2));
                        int i;
                        while((i = bis.read(buf)) != -1){
                        bos.flush();//强制写出
                        bos.write(buf,0,i);
                        }
                        bis.close();
                        bos.close();
                        
                } else {
                        System.out.println("这不是个文件!");
                }
        }
}
回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-6-2 23:13 编辑

你指的大文件有多大??????
byte[] buf = new byte[fis.available()];你把這句話改成明確的數字基數為1024,具體多少倍你可以自己去定義.
avaliable()方法對於容量比較大的文件不適用.
回复 使用道具 举报
错误出在这里byte[] buf = new byte[fis.available()];,毕老可是说过,  要少用available()方法,  如果文件太大,即fis.available() 过大, new byte[fis.available()]无法开辟出这么多的内存空间出来, 就会造成内存不足,无法达到目的;      
回复 使用道具 举报
错误是说内存溢出,原因是因为jvm的heap一般情况下是64MB,该文件超出了虚拟机可用的内存空间。这个内存大小可以认为调整的。如果只是实验就没必要改变他的大小了。
回复 使用道具 举报
fis.available()该方法的意思是文件有多大,就取多少,如果电影太大的,就会造成内存不够,所以会报错。
1、一般是这样做
byte[] buf = new byte[1024];
2、或者加个转换流,然后使用高效读取方法,具体代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class CopyFile {

        public static void main(String[] args) throws Exception {
                File f = new File("E:\\word.txt"); // 原始文件

                if (f.isFile() == true) {

                        FileInputStream fis = new FileInputStream(f);
                        BufferedReader br = new BufferedReader(new InputStreamReader(fis));

                        File f2 = new File("E:\\orrd.txt"); // 复制后的文件
                        FileOutputStream fos = new FileOutputStream(f2);
                        BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(fos));

                        String line = null;
                        while ((line = br.readLine()) != null) {

                                bos.write(line);
                                bos.flush(); // 强制写出
                                bos.close();

                        }
                } else {
                        System.out.println("这不是个文件!");
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 赞一个!

查看全部评分

回复 使用道具 举报
问题出在这里:byte[] buf = new byte[fis.available()];
你在内存中开辟空间存放byte数组,开辟空间的大小取决于你文件大小,如果超过系统默认的64M虚拟内存(虚拟内存可调整),就会出现内存溢出导致程序出错,而一般电影文件远远超出了这个值,出现错误在所难免
此时解决办法就是定义1024字节的数组,然后用循环读取和写入的IO技术在保证内存的情况下完成数据的拷贝

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马