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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-7-26 12:29  /  2687 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我写了一段拷贝文件的代码,代码如下:
  1. import java.io.*;

  2. class FileWork
  3. {
  4.         private String sourceName, destName;
  5.         private BufferedReader read;
  6.         private BufferedWriter write;
  7.         private String line;
  8.        
  9.         private boolean openFile()
  10.         {
  11.                 try
  12.                 {
  13.                         read = new BufferedReader(new FileReader(sourceName));
  14.                 }
  15.                 catch(IOException e)
  16.                 {
  17.                         System.out.println("OpenFileException:"+sourceName);
  18.                         return false;
  19.                 }
  20.                
  21.                 try
  22.                 {
  23.                         write = new BufferedWriter(new FileWriter(destName));
  24.                 }
  25.                 catch(IOException e)
  26.                 {
  27.                         System.out.println("OpenFileException:"+destName);
  28.                         return false;
  29.                 }
  30.                 return true;
  31.         }
  32.        
  33.         private boolean copyFile()
  34.         {
  35.                 int count = 0;
  36.                 try
  37.                 {
  38.                         line = read.readLine();
  39.                         while(line != null)
  40.                         {                               
  41.                                 write.write(line);
  42.                                 write.newLine();
  43.                                 line = read.readLine();
  44.                         }
  45.                 }
  46.                 catch(IOException e)
  47.                 {
  48.                         count++;
  49.                         if(count > 0)
  50.                           System.out.println("Find "+count+" IOException");
  51.                 }
  52.                 return true;
  53.         }
  54.        
  55.         private boolean closeFile()
  56.         {
  57.                 boolean flag = true;
  58.                 try
  59.                 {
  60.                         read.close();
  61.                 }
  62.                 catch(IOException e)
  63.                 {
  64.                         System.out.println("CloseFileException:"+sourceName);
  65.                         flag = false;
  66.                 }
  67.                 try
  68.                 {
  69.                         write.close();
  70.                 }
  71.                 catch(IOException e)
  72.                 {
  73.                         System.out.println("CloseFileException:"+destName);
  74.                         flag = false;
  75.                 }
  76.                 return flag;               
  77.         }
  78.        
  79.         public boolean work(String src, String dst)
  80.         {
  81.                 sourceName = src;
  82.                 destName = dst;
  83.                
  84.                 return openFile()&©File()&&closeFile();
  85.         }
  86. }
复制代码
我测试的时候,先拷贝了一个8.63M的.out文件,没有问题,之后我又拷贝了一个135M的.out文件结果提示OutoffMemeryException异常。然后我查了一下关于BufferedReader的信息,它的默认大小是8K,那么也就是说它并不是一次就存取完的,是份多次存取的,那如果是这样的话为什么还有内存异常呢?请给出原因和解决办法,感谢给位大牛!






4 个回复

倒序浏览
OutoffMemeryException异常是吗因为内存溢出或没有可用的内存提供给垃圾回收器时,Java 虚拟机无法分配一个对象,这时抛出该异常。
文件太大,超过JVM内存,溢出了。
回复 使用道具 举报
你这里用的是装饰流,BufferedReader,BufferedWriter,readLine()方法来读取数据。
他们都是字符流,字符流是用来读取或写入文本文件的。readLine()方法是读到了换行就存储进去,再读。
而你这里要复制的文件时MP3格式的,那必须用字节流来读取。一般用字节数组来缓存数据。
byte[] by = new byte [1024];
这里抛异常时因为你用readLine()方法。他没有读到换行的字符时就一直读下去,MP3文件中没有换行符。
所有jvm分配的缓存装满了,他还在读。就内存溢出了。
回复 使用道具 举报
你在进行文件Copy的时候用的是字符流,每次取出的数据是以line为单位的。
对于正常的存储字符的文件来说,每遇到一个"\r\n"就将数据读出来放到内存中,如果这行的数据量很小当然没有问题,
但是对于二进制文件,也许程序从头读到尾都读不到“\r\n”对应的编码,所以它会一口气将整个文件(100多M)读出来,
结果可想而知了。
建议你用字节流Copy文件
回复 使用道具 举报
大家说的不错,我刚发现,我那个文件确实是文本数据,可是里面没有换行,也就是说readLine()根本装不下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马