import java.io.*; 
public class Test { /** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 
copy(); 
}//main() 
static void copy() throws IOException{ 
FileReader fr = new FileReader("E:/StormMedia/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb"); 
BufferedReader br = new BufferedReader(fr); 
FileWriter fw = new FileWriter("F:/ting/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb"); 
BufferedWriter bw = new BufferedWriter(fw); 
int b =0; while((b = br.read())!=-1){ 
bw.write((char)b); 
}                              //只需要循环writer,条件是reader的条件     
bw.flush(); 
bw.close(); br.close(); 
} }//class 

解决方案 »

  1.   

    二进制文件不能使用 Reader/Writer 进行操作,应该使用 InputStream, OutputStream 进行操作!
      

  2.   

    你换成FileInputStream和FileOutputStream应该就没问题了
      

  3.   

    呵呵,你把他弄成char写入?那可是二进制文件,不是文本文件!
      

  4.   

    为什么通道能10几M的传输
    而lz的为什么没那么快?
      

  5.   

    原生流用字节流,包上过滤流
    另外如果是字符流的话推荐直接用PrintWriter输出
    FileReader fr = new FileReader("E:/StormMedia/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb");  
    DataInputStream in = new DataInputStream(new FileInputStream(fr)); FileWriter fw = new FileWriter("F:/ting/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb");  
    PrintStream out = new PrintStream(fw);int i = -1;
    byte[] buffer = new byte[1024*10240];//每次IO操作缓存为10M
    while ((i = in.read(buffer)) != -1) {
    out.write(buffer, 0, i);
    }
      

  6.   

    为什么效率高,我说不上来;
    可以参考下API文档关于java.nio.channels.FileChannel
    的两个方法
    abstract  long transferFrom(ReadableByteChannel src, long position, long count) 
              将字节从给定的可读取字节通道传输到此通道的文件中。 
    abstract  long transferTo(long position, long count, WritableByteChannel target) 
              将字节从此通道的文件传输到给定的可写入字节通道。 
      

  7.   

    是不是Filechannel不将字节读入内存,只读入缓存,使得速度变快;这样理解对不对
      

  8.   

    Filechannel是用的映射机制,直接把整个文件的内容映射到虚拟内存,只不过相对于一半不太大的东西还是不要用的好,毕竟这鬼东西有先天的bug,之前的项目遇到过这问题,可以打开不能关闭缓存
    另外为什么包装的效率高,概念其实就和打包一样你让我统计人数,人都在你家楼下,而你在自己家里,我是点每点一个人然后跑到楼上去告诉你,例如:1+1+1+1+1 好呢还是我自己点完了然后上楼直接告诉你5个人好呢?
    这里要知道一个概念每次我告诉你+1这个动作(就是从楼下跑到楼上)是用的N毫秒,而我自己去数一个人所需要的时间为N纳秒
    我们假设现在有1024*10240*10个人
    如果要提高效率的话,我们是不是应该尽量让我自己去数,数完了告诉你结果就是了?
    但是如果中间出现什么问题,比如我数的时候你有事或者我临时有事中断了怎么办,而且你未必有耐心等我全部数完
    所以我们不要等到我全部数完,我和你约定好,我每次数1024*10240就告诉你结果
    那么我告诉你10次就能得到所有的人数了至于映射么,不太好比喻,要真比喻的话就想成你从楼上拿个相机把楼下的人集体拍了一张照片,然后坐沙发上慢慢看着照片点人头
                                                 
      

  9.   


    FileReader fr = new FileReader("E:/StormMedia/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb");  
    DataInputStream in = new DataInputStream(new FileInputStream(fr)); 
    (这两句代码代表我这个人)
    FileWriter fw = new FileWriter("F:/ting/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb");  
    PrintStream out = new PrintStream(fw);
    (这两句代码代表你这个人)我们假设现在有1024*10240*10个人
    (E:/StormMedia/十月围城DVD国语修正中字无水印[6VDY.COM原创].rmvb大小是1024*10240*10字节)如果要提高效率的话,我们是不是应该尽量让我自己去数,数完了告诉你结果就是了?
    (什么时候算数完?)int i = -1;
    (当i=-1的时候就数完了,这里还没开始数,但是先定义为-1,默认的是不是需要数的状态,逆向思维,就是说当 i != -1 的时候就是在数)
    byte[] buffer = new byte[1024*10240];//每次IO操作缓存为10M
    (但是如果中间出现什么问题,比如我数的时候你有事或者我临时有事中断了怎么办,而且你未必有耐心等我全部数完
    所以我们不要等到我全部数完,我和你约定好,我每次数1024*10240就告诉你结果)
    while ((i = in.read(buffer)) != -1) {
        out.write(buffer, 0, i);
    }
    (这里的(i = in.read(buffer))就是在数了  out.write(buffer, 0, i);就是告诉你我数的结果,为什么要    out.write(buffer, 0, i);因为这个例子这里正好是10次,所以我不需要告诉你结果,我们之前约定过我每次数1024*10240就上一次楼,你自己数我上楼多少次就知道结果了,但是如果说人数是1024*10240*10+20呢?需要11次是没错,但是最后一次我告诉你的数字就不是1024*10240了,所以我每次还要告诉你我数了多少个具体的数字
    while ((i = in.read(buffer)) != -1) {
    就是判断是不是还需要继续数,这个表达式,先执行的是括号内的语句,就是i=in.read(buffer)
    这里给两个变量赋值了,先是in.read(buffer),read方法内部把buffer的引用指向改了,然后才是通过read方法的返回值赋值给i,之后就是判断i是否=-1,如果是就停止,如果不是就继续
    其实这里是先读,应该说是读不到新面孔的时候才得到-1,我告诉自己说不用再继续点人头了