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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马—陈磊 中级黑马   /  2012-6-12 15:05  /  1717 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • 对IO流不太熟,将一个2兆的文件从d盘复制到e盘,多了8兆多。。。??
    try {
        FileInputStream input = new FileInputStream("d:/Java编程思想第四版完整中文高清版%28免费%29.rar");
        FileOutputStream output = new FileOutputStream("e:/Java编程思想第四版完整中文高清版%28免费%29.rar");
                 BufferedInputStream bufferinput = new BufferedInputStream(input);
                 BufferedOutputStream outbuffer = new BufferedOutputStream(output);
                 byte[] copt = new byte[1024*1024*10];
                 while(bufferinput.read(copt)>-1){
                
                 outbuffer.write(copt);
                
                 }
                 bufferinput.close();
                 outbuffer.close();
                 input.close();
                 output.close();
             } catch (FileNotFoundException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }

  我觉得可能是byte[] 数组定义过大了,但为什么会多出8M多,多出的文件是什么文件,复制好后的文件除了变大外还可以使用、、、

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
outbuffer.write(copt);
进行数据写入的时候,如果用的是字节数组,要加上数组缓冲数据的长度,如下:
outbuffer.write(copt, 0 ,len);
因为我们要写入的是读取的数据,读取的数据长度和数组的长度是不一样的,而原来数组当中存有数据,默认基本数据类型元素是0,读取数据到缓冲数组时会覆盖数组原来的数据,你这里读取的数据只能覆盖数组的一部分,所以你不指定要写入的长度,会把其他没覆盖的也写入了,也就是写入了整个数组的数据。还有,带缓冲的,最好都刷新。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你这样是直接把10m的数组写出去了  改一下就好了  定义一个int 变量  然后写出变量大小的数组
try {
    FileInputStream input = new FileInputStream("d:/Java编程思想第四版完整中文高清版%28免费%29.rar");
    FileOutputStream output = new FileOutputStream("e:/Java编程思想第四版完整中文高清版%28免费%29.rar");
             BufferedInputStream bufferinput = new BufferedInputStream(input);
             BufferedOutputStream outbuffer = new BufferedOutputStream(output);
             byte[] copt = new byte[1024*1024*10];
                int len;
             while((len=bufferinput.read(copt))!=-1){
            
             outbuffer.write(copt,0,len);
            
             }
             bufferinput.close();
             outbuffer.close();
             input.close();
             output.close();
         } catch (FileNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  byte[] copt = new byte[1024*1024*10];
这里定义这个字节数组大小:10兆,

outbuffer.write(copt);
这里将整个字节数组都写入新文件中。而没有指定写入哪一部分。   原文件2兆,那么你定义的byte[] copt中还有8兆就是数组创建时默认值。之后一块写入。

这里应该:outbuffer.write(copt,0,len),指定将字节数组的一部分写入新文件中。 定义int len,因为 该read(),返回读取的字节数。令len=buffinput.read(copt),  对于你的这次操作,只取一次就可以了,len就是取到的2兆的字节数。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

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