黑马程序员技术交流社区

标题: java IO流的疑问 [打印本页]

作者: 黑马—陈磊    时间: 2012-6-12 15:05
标题: java IO流的疑问
  我觉得可能是byte[] 数组定义过大了,但为什么会多出8M多,多出的文件是什么文件,复制好后的文件除了变大外还可以使用、、、


作者: 潘东升    时间: 2012-6-12 15:20
outbuffer.write(copt);
进行数据写入的时候,如果用的是字节数组,要加上数组缓冲数据的长度,如下:
outbuffer.write(copt, 0 ,len);
因为我们要写入的是读取的数据,读取的数据长度和数组的长度是不一样的,而原来数组当中存有数据,默认基本数据类型元素是0,读取数据到缓冲数组时会覆盖数组原来的数据,你这里读取的数据只能覆盖数组的一部分,所以你不指定要写入的长度,会把其他没覆盖的也写入了,也就是写入了整个数组的数据。还有,带缓冲的,最好都刷新。
作者: 姚玉鹏    时间: 2012-6-12 15:21
你这样是直接把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();
         }
作者: 孙峰    时间: 2012-6-12 15:42
  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兆的字节数。




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