黑马程序员技术交流社区

标题: 关于I/O复制文件问题,为什么复制出来的文件不能用了? [打印本页]

作者: 高云飞    时间: 2012-5-7 12:27
标题: 关于I/O复制文件问题,为什么复制出来的文件不能用了?
基础测试题中有一个要求复制文件的题,我写的时候,用了一个文本文件测试的,发现复制后的文件可以看,今天我用了一个Mp3文件实验,结果,写了几个方法,新复制出来的文件都不能打开了。这是怎么回事?还有就是,复制出来的文件比原文件都小一些。
我的四个方法如下:
方法一:
public void copy1 (File from, String to) throws IOException, FileNotFoundException {
                int read;
                InputStreamReader isr = new InputStreamReader (new FileInputStream (from));
                FileWriter fw = new FileWriter (to);
                while ((read = isr.read()) != -1) {
                        fw.write(read);
                }
                fw.flush();
                fw.close();
               
        }

方法二:
public void copy2 (File from, String to) throws IOException, FileNotFoundException {
                BufferedReader br = new BufferedReader (new FileReader (from));
                FileWriter fw = new FileWriter (to);
                //BufferedWriter bw = new BufferedWriter (fw);
                String read = new String();
                while ((read = br.readLine()) != null) {
                        fw.write(read);
                }
                fw.flush();
                fw.close();
        }

方法三:
public void copy3 (File from, String to) throws IOException, FileNotFoundException {
                BufferedReader br = new BufferedReader (new FileReader (from));
                FileWriter fw = new FileWriter (to);
                BufferedWriter bw = new BufferedWriter (fw);
                String read = new String();
                while ((read = br.readLine()) != null) {
                        bw.write(read);
                }
                bw.flush();
                bw.close();
        }

方法四:
public void copyEfi3 (File from, String to) throws IOException, FileNotFoundException {
                BufferedReader br = new BufferedReader (new FileReader (from));
                //FileWriter fw = new FileWriter (to);
                BufferedWriter bw = new BufferedWriter (new FileWriter (to));
                String read = new String();
                while ((read = br.readLine()) != null) {
                        bw.write(read);
                }
                bw.flush();
                bw.close();
        }



作者: 徐慧书    时间: 2012-5-7 12:30
这个哥们, 你看看,这些方法用的基本都是字符流,要知道对于非文本文件,要想复制成功,我们必须使用字节流的 也就是FileInputStream 和 FileOutputStream
这样就问题了,赶快试一下吧
作者: 谭景宾    时间: 2012-5-7 12:38
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
     所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.
      字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

把你方法的所有字符流改成字节流FileInputStream 和 FileOutputStream就好了
作者: 蒋映辉    时间: 2012-5-7 12:47
package com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class aaa {
        public static void main(String[] args) throws IOException
        {
                File file=new File("d:\\qqq.mp3");
                FileInputStream r=new FileInputStream(file);
                FileOutputStream fos=new FileOutputStream("d:\\333.mp3");
                byte[] ch=new byte[32];
                int hasRead=0;
                while((hasRead=r.read(ch))!=-1){
                        fos.write(ch);
                }
        }

}
自己写的一个复制MP3的   你可以看看
作者: 高云飞    时间: 2012-5-7 13:15
大家求老师给加分吧。
作者: 高云飞    时间: 2012-5-7 13:30
学习了,一定会实验去的
作者: 高云飞    时间: 2012-5-7 15:37
蒋映辉 发表于 2012-5-7 12:47
package com;

import java.io.BufferedReader;

请问:你带代码中的,ch为什么是new byte[32],而不是new byte[其他值]?
我自己实现的规律是,其中数值越大,速度越快,当为32的时候,与原文件大小相同,为4096时,比原文件大了3k。
作者: 蒋映辉    时间: 2012-5-7 15:47
高云飞 发表于 2012-5-7 15:37
请问:你带代码中的,ch为什么是new byte[32],而不是new byte[其他值]?
我自己实现的规律是,其中数值越 ...

应该是你把数组空间弄大了,然后实际内容没那么大  就存进了空内容进去
作者: 高云飞    时间: 2012-5-7 16:05
蒋映辉 发表于 2012-5-7 15:47
应该是你把数组空间弄大了,然后实际内容没那么大  就存进了空内容进去

莫非是一些无关的数据?如果其中夹杂了无关数据,那怎么还可以照常播放啊
作者: 蒋映辉    时间: 2012-5-7 16:13
高云飞 发表于 2012-5-7 16:05
莫非是一些无关的数据?如果其中夹杂了无关数据,那怎么还可以照常播放啊 ...

我也测试了一下   确实变大了  但是音乐可以照常播放,变大后的文件播放时间也要长一些了,但是最后那段多出来的时间是空白,所以刚才分析是正确的吧
作者: H_H_K    时间: 2012-5-7 16:19
攒分升级用户组
作者: 赵志勇    时间: 2012-5-7 18:31
路过,以后会遇到这个问题的。
作者: 高云飞    时间: 2012-5-7 18:37
蒋映辉 发表于 2012-5-7 16:13
我也测试了一下   确实变大了  但是音乐可以照常播放,变大后的文件播放时间也要长一些了,但是最后那段 ...

以此看来,不读取一个byte数组,而是读取一个byte数据,再写就和原来数据一样了。太具有求知精神了
作者: 蒋映辉    时间: 2012-5-7 18:41
高云飞 发表于 2012-5-7 18:37
以此看来,不读取一个byte数组,而是读取一个byte数据,再写就和原来数据一样了。太具有求知精神了 ...

但是这个就要经过多少次循环。。。。这个速度就。。。。
后来做其他题了时候确定了  字符不够确实被填进了垃圾字符




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