黑马程序员技术交流社区

标题: IO流中的Copy时出现的问题 [打印本页]

作者: 张建峰    时间: 2012-8-12 21:41
标题: IO流中的Copy时出现的问题
  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.List;

  9. public class EncryptDemo {        public static void main(String[] args) throws IOException {
  10.                 List<Integer> list = new ArrayList<Integer>();
  11.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("曲婉婷-我的歌声里.ape"));
  12.                 int b;
  13.                 while((b=bis.read())!=-1)
  14.                         list.add(b^123);
  15.                
  16.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("曲婉婷-我的歌声里.ape"));
  17.         for (Integer integer : list) {
  18.                         bos.write(integer);
  19.         }
  20.                
  21.                 bis.close();
  22.                 bos.close();
  23.         }

  24. }
复制代码
刚学IO流,敲了一个这样的Copy文件的代码,里面传入的文件时一个学习笔记时,是可以Copy的,但是当我把这首歌放进去后,出现了下面的错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
并且提示是list.add(b^123)时出现的错误
如果说错误是装不下的话,list这个集合的长度不是不限制的吗?而b^123得到的也是int型的,为什么会装不下
又该怎么解决呢?
作者: 郑小杰    时间: 2012-8-12 22:24
把17行,"曲婉婷-我的歌声里.ape"换成"曲婉婷-我的歌声里01.ape"试一下


作者: 徐小骥    时间: 2012-8-12 22:31
         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("曲婉婷-我的歌声里.ape"));//读取文件“曲婉婷-我的歌声里.ape”
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("曲婉婷-我的歌声里.ape"));//存放文件并命名“曲婉婷-我的歌声里.ape”
你这是从A文件读取一段数据写入A文件啊!你可以把存放文件的文件名改为其它的文件名,或者修改文件存放路径
作者: 官文昌    时间: 2012-8-12 22:57
import java.io.*;
import java.util.*;

public class EncryptDemo {        public static void main(String[] args) throws IOException {
                List<Integer> list = new ArrayList<Integer>();
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("曲婉婷-我的歌声里.ape"));
              BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("曲婉婷-我的歌声里.ape"));
               byte[] bye =new byte[1024];//你都写了缓冲流了为啥不用数组呢??
                int b=0;
                while((b=bis.read(bye))!=-1)//有了缓冲了流就最好用read(char[] cbuf)方法,
                      //  list.add(b^123);我没有搞懂你这句话啥意思???
                 list.add(b);
         
        for (Integer integer : list) {
                        bos.write(integer);
        }
               
                bis.close();
                bos.close();
        }

}

当我们用了缓冲流时,一般就用缓冲流的方法,这样代码的效率会大大的提高~~
作者: 吴小东    时间: 2012-8-13 00:42
这个程序我没有自己去写,我大概分析一下问题所在,如果有错请指出
首先 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
这个错误是内存溢出,
提示 list.add(b^123)时出现的错误  是因为 你的list的容量已经超出了内存的容量
至于为什么会出现这种情况。。
你的程序是一直在从目标文件 A 取出数据 又在向该文件写入数据,那么就像我们说的死循环,
然而你又把读取出来的数据存放到list中那么这个list的容量就会越来越大 最后造成内存溢出。

还有楼上提的那个问题 list.add(b^123) 的意思,我猜想楼主莫非是想对数据进行加密?



作者: 黎健东    时间: 2012-8-13 04:42
本帖最后由 黎健东 于 2012-8-13 04:47 编辑

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.List;

  8. public class EncryptDemo {
  9.         public static void main(String[] args) throws IOException {
  10.                 //读取a文件,把加密内容存到list中
  11.                 //用Byte型是因为要将缓冲存进来
  12.                 List<Byte> list = new ArrayList<Byte>();
  13.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
  14.                                 "c:\\a.txt"));
  15.                 read(list, bis);
  16.                 //将list中的加密内容写到b文件中
  17.                 BufferedOutputStream bos = new BufferedOutputStream(
  18.                                 new FileOutputStream("c:\\b.txt"));
  19.                 write(list, bos);
  20.                
  21.                 //读取b文件,把解密内容存到list2中
  22.                 List<Byte> list2 = new ArrayList<Byte>();
  23.                 BufferedInputStream bis2 = new BufferedInputStream(new FileInputStream(
  24.                                 "c:\\b.txt"));
  25.                 read(list2, bis2);
  26.                
  27.                 //将list2中的加密内容写到c文件中
  28.                 BufferedOutputStream bos2 = new BufferedOutputStream(
  29.                                 new FileOutputStream("c:\\c.txt"));
  30.                 write(list2, bos2);
  31.         }

  32.         /**
  33.          * @param list
  34.          * @param bos
  35.          * @throws IOException
  36.          */
  37.         public static void write(List<Byte> list, BufferedOutputStream bos)
  38.                         throws IOException {
  39.                 for (Byte bt : list) {
  40.                         bos.write(bt);
  41.                 }        
  42.                 bos.close();
  43.         }

  44.         /**
  45.          * @param list
  46.          * @param bis
  47.          * @throws IOException
  48.          */
  49.         public static void read(List<Byte> list, BufferedInputStream bis)
  50.                         throws IOException {
  51.                 int r = 0;
  52.                 //缓存
  53.                 byte[] data = new byte[1024];

  54.                 //麻烦抒写规范,while循环就算一条语句也要加括号
  55.                 while ((r = bis.read(data)) != -1)
  56.                 {
  57.                         for(byte bt : data){
  58.                                 //这里是你的加密
  59.                                 bt ^= 123;
  60.                                 //把加密文件存到list中
  61.                                 list.add(bt);
  62.                         }
  63.                 }
  64.                 bis.close();
  65.         }

  66. }
复制代码
上面的代码是根据楼主的代码修改的
因为楼主的文件是ape,不好做演示,所以改成txt,你改成ape也行,一样用

上面的代码用了楼主想要用的加密、list存储,还有新增了缓冲
基本都应该看得明白的,不明白再提出。
特别指出,楼主的代码书写/排版很不规范,希望改进。

作者: 张建峰    时间: 2012-8-13 07:45
我的程序是对那首歌进行加密,第一次运行会加密,第二次运行就会还原,放入一个txt文件就可以看到效果,没有死循环
文件名也是可以一样的
但是这首歌就是不行,我的疑问是:
如果说错误是装不下的话,list这个集合的长度不是不限制的吗?而b^123得到的也是int型的,为什么会装不下
又该怎么解决呢?
作者: Achille    时间: 2012-8-13 17:49
吴小东 发表于 2012-8-13 00:42
这个程序我没有自己去写,我大概分析一下问题所在,如果有错请指出
首先 Exception in thread "main" java. ...

说的是啊  我也是任务是这样的啊啊




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