我希望从本地和远程复制文件,文件都很大,10G级的,如何快速的复制?看网上有人说使用管道到管道,这确实比其他的快,不知道fastcopy是怎样实现的,各位有什么想法?

解决方案 »

  1.   

    百度搜一下bufferedStream 和 FileStream
      

  2.   

    用CLOB类型吧,单个变量可以存储4G,再加上BufferedStream.
      

  3.   

    本地远程复制大文件啊,而且还是10G这么大的。你看看迅雷啊,他是多部分一起传的。java传输文件就是一般的文件操作啊,你可以模仿迅雷,开多个线程下载,每个线程记录下载部分的开始和结束索引,一起下到远程去。至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。
      

  4.   


    楼上的,你见过用 java 开发的运行在 windows 上的桌面应用软件吗
    快车这些东西之所以不用 java 做,最大的原因不是它的效率,而是它必须要安装JVM快车只不过客户端的东西,服务端运行 java 是很常见的。楼主的这个问题用多线程来解决应该不存在效率问题。
      

  5.   

    我使用nio和io来测试一个100m的文件,虽然每次速度不同,但是都是io的比nio的快怎么回事import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;public class CopyFile {
    /**
     * nio拷贝
     * @param inFile  源文件
     * @param outFile 目标文件
     * @return
     * @throws Exception
     */
    public static long FileChannelCopy(String inFile,String outFile) throws Exception
    {
    long begin = System.currentTimeMillis();
    File in = new File(inFile);
    File out = new File(outFile);
    FileInputStream fin = new FileInputStream(in);
    FileOutputStream fout = new FileOutputStream(out);
    FileChannel inc = fin.getChannel();
    FileChannel outc = fout.getChannel();
    int bufferLen = 2097152;
    ByteBuffer bb = ByteBuffer.allocateDirect(bufferLen);
    while (true)
    {
    int ret = inc.read(bb);
    if (ret == -1)
    {   
    fin.close();
    fout.flush();
    fout.close();
    break;
    }
    bb.flip();
    outc.write(bb);
    bb.clear();
    }
    long end = System.currentTimeMillis();
    long runtime = 0;
    if(end >  begin)
    runtime = end - begin;
    return runtime; }
    /**
     * io拷贝
     * @param inFile 源文件
     * @param outFile 目标文件
     * @return
     * @throws Exception
     */
    public static long FileStraeamCopy(String inFile,String outFile) throws Exception
    {
    long begin = System.currentTimeMillis();

    File in = new File(inFile);
    File out = new File(outFile);
    FileInputStream fin=new FileInputStream(in);
    FileOutputStream fout=new FileOutputStream(out);

    int length=2097152;//2m内存
    byte[] buffer=new byte[length];

    while(true)
    {
    int ins=fin.read(buffer);
    if(ins==-1)
    {
    fin.close();
    fout.flush();
    fout.close();
    break;

    }else
    fout.write(buffer,0,ins);

    }
    long end = System.currentTimeMillis();
    long runtime = 0;
    if(end > begin)
    runtime = end - begin;
    return runtime; }
    static public void main(String args[]) throws Exception {
    String inFile = "D:\\big4.pdf"; //源文件
    String outFile = "D:\\big4copy1.pdf"; //输出文件1
    String outFile2 = "D:\\big4copy2.pdf"; //输出文件2
    long runtime1,runtime2;
    runtime1 = FileChannelCopy(inFile,outFile);
    runtime2 = FileStraeamCopy(inFile,outFile2);
    System.out.println("FileChannelCopy running time:" + runtime1);
    System.out.println("FileStraeamCopy running time:" + runtime2);



    }
    }某一次运行输出结果FileChannelCopy running time:9969
    FileStraeamCopy running time:6421
      

  6.   

    有时FileChannelCopy 比FileChannelCopy 快
      

  7.   

    有个工具叫fastcopy,不知道是采用什么思想
      

  8.   


    多线程下载,我同意,我也是这样说的,至于你说的 服务器端运行 java ,而 客户端不用 java 做是因为JVM的关系,我不同意。想这种远程IO操作,C++效率肯定要比java高。你用脚指头想想,并看下java io部分那个.dll是用什么实现的,你就知道了。
      

  9.   


    不可能 
    nio 肯定更快
      

  10.   

    lz可以test下import java.io.*;
    import java.nio.*;
    import java.nio.channels.*;//从得到的耗时结果来看 nio效率高很多!!public class TestFileChannel {
    /*
    public static void main(String args[])throws Exception{
      
    ByteBuffer buff=ByteBuffer.allocate(1024);
    FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
    FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileChannelOut.txt");
    FileChannel in=fileIn.getChannel();
    FileChannel out=fileOut.getChannel();
    long l=System.currentTimeMillis();

    while(in.read(buff)!=-1){
    buff.flip();   //把极限设为位置  再把位置设为0
    out.write(buff);
    buff.clear(); //不改变极限  把位置设为0
    }

    System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//31ms
    in.close();
    out.close();
    fileIn.close();
    fileOut.close();
    }  */ public static void main(String[] args)throws Exception{

    FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
    FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileOutputStreamCopyTime.txt");
    int i;
    long l=System.currentTimeMillis();
    while((i=fileIn.read())!=-1){
    fileOut.write(i);
    }
    System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//516ms
    fileIn.close();
    fileOut.close();

    }
        
    }
      

  11.   

    我测试了一下,某一次结果:用nio复制一个100m的文件用时10469ms,使用io等了好久不出来,我就关了,申请的都是2m的内存,ByteBuffer buff=ByteBuffer.allocate(2097152);
      

  12.   

    好像有源代码:http://www.ipmsg.org/archive/FastCopy199r4src.zip
      

  13.   

    用13楼代码,使用nio和io实验了一下,复制一个1.1G的文件夹,io用时13分钟,nio用时6分钟,其中该文件夹中有个子文件夹a,大小40M,故意设置其子文件夹有更多的层数,即子文件夹a下还下有多个孙文件夹,孙文件夹下也同样有更多的子文件夹,因此递归遍历复制时消耗了好多时间,测试了一下,单单复制这个40M的子文件夹,nio用了2分18秒,而io用了将近7分。因此改进一下遍历算法还能够提高复制效率
      

  14.   


    这么长时间的连接,我估计早就 time out了。
      

  15.   

    其实NIO的主要提高源自共享内存,native code和java code能共享非jvm堆的内存,这是一个最显著的提高
      

  16.   

    百度搜一下bufferedStream 和 FileStream
      

  17.   

    用FileChannel的transferTo(long position, long count, WritableByteChannel target)方法试试
      

  18.   

    同意 假期写过用channel的复制功能 挺不错的 4G的多久就搞定了 nio里面
      

  19.   

    基本的技术路线是 buffer + nio
      

  20.   

    public static void main(String[] args)throws Exception{
            
            FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
            FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileOutputStreamCopyTime.txt");
            int i;
            long l=System.currentTimeMillis();
            while((i=fileIn.read())!=-1){
                fileOut.write(i);            
            }
            System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//516ms
            fileIn.close();
            fileOut.close();
      

  21.   

    开它娘的4--5 个线程或是进程一起下,DOWN 下来的再拼起来不就结了.搞那么麻烦干嘛.
      

  22.   

    FileChannel的transferTo(long position, long count, WritableByteChannel target)方法试试顶!!!
      

  23.   

    nio 铁定比 io 快 
      

  24.   

    这个来说两句:
    NIO里面的Chanel不是总是效率最高的, 需要看文件的大小, 上次我做过一个文件分割的程序, 如果文件不是太大的时候BufferStream要好些。 但是如果文件大而且重复运行的时候,NIO优势就明显了。需要说明的是如果中间没有运算只是同机拷贝的话, 单线程是最快的, 线程多了反而会慢。 随机读取用来拷贝文件是最慢的。
      

  25.   

    效率一直都不是java流行的原因,讨论这个,完全没意义