读书人

Java怎么快速复制大文件

发布时间: 2012-03-24 14:00:46 作者: rapoo

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

[解决办法]
内存文件映射
[解决办法]
学习中..
[解决办法]
学习中......
[解决办法]
用CLOB类型吧,单个变量可以存储4G,再加上BufferedStream.
[解决办法]
本地远程复制大文件啊,而且还是10G这么大的。你看看迅雷啊,他是多部分一起传的。java传输文件就是一般的文件操作啊,你可以模仿迅雷,开多个线程下载,每个线程记录下载部分的开始和结束索引,一起下到远程去。

至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。
[解决办法]

探讨

至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。

[解决办法]
用nio,比io效率好点
[解决办法]
支持
[解决办法]
学习中。。。。。。
[解决办法]
多线程 + FTP
[解决办法]

[解决办法]
探讨
引用:

至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。


楼上的,你见过用 java 开发的运行在 windows 上的桌面应用软件吗


快车这些东西之所以不用 java 做,最大的原因不是它的效率,而是它必须要安装JVM

快车只不过客户端的东西,服务端运行 java 是很常见的。楼主的这个问题用多线程来解决应该不存在效率问题。



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

[解决办法]
探讨
我使用nio和io来测试一个100m的文件,虽然每次速度不同,但是都是io的比nio的快怎么回事
Java codeimport java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;publicclass CopyFile {/**
* nio拷贝
*@param inFile 源文件
*@param outFile 目标文件
*@return
*@throws Exception*/publicstaticlong 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*/publicstaticlong 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=newbyte[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;

}staticpublicvoid main(String args[])throws Exception {
String inFile="D:\\big4.pdf";//源文件 String outFile="D:\\big4copy1.pdf";//输出文件1 String outFile2="D:\\big4copy2.pdf";//输出文件2long runtime1,runtime2;
runtime1= FileChannelCopy(inFile,outFile);
runtime2= FileStraeamCopy(inFile,outFile2);
System.out.println("FileChannelCopy running time:"+ runtime1);
System.out.println("FileStraeamCopy running time:"+ runtime2);





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


[解决办法]
lz可以test下
Java code
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();            }        }
[解决办法]

[解决办法]
探讨
有个工具叫fastcopy,不知道是采用什么思想

[解决办法]
UP
[解决办法]
学习学习了,这代码真有用,真的能复制东西了,呵呵!!
[解决办法]
其实NIO的主要提高源自共享内存,native code和java code能共享非jvm堆的内存,这是一个最显著的提高
[解决办法]
学习了, 下次自己试一下.
------解决方案--------------------


mm
[解决办法]
学习中~~
[解决办法]
学习!!
[解决办法]
用FileChannel的transferTo(long position, long count, WritableByteChannel target)方法试试
[解决办法]

探讨
用nio,比io效率好点

[解决办法]
期待好的解决方法
收藏了!~
[解决办法]
并不是线程开的越多,速度就越来。
[解决办法]
学习中、、、
[解决办法]

[解决办法]
google一下不就知道了
[解决办法]
...
[解决办法]
学习中。。。。。。
[解决办法]

学习了
[解决办法]
顶!

读书人网 >J2SE开发

热点推荐