首先,针对java高效实现大文件拷贝功能,可以采用NIO(Non-blocking IO,非阻塞IO)的方式进行操作。
在Java NIO中,Channel是用于连接Socket、File、Selector以及管道(Pipe)的一个全新的概念,它要比Java IO中的流(Stream)更加快速和灵活,所以我们选择使用通道来进行大文件拷贝。
FileInputStream fis = new FileInputStream("srcFile");
FileOutputStream fos = new FileOutputStream("destFile");
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel();
缓存区是基于内存的数据存储区域,在I/O操作中,内存缓冲区中包含有读出或要写入到通道的数据内容,读取或向通道写入的过程中,都需要通过缓冲区进行实现。
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(inChannel.read(buffer) != -1) {
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
此处我们采用1024字节的Buffer进行拷贝,NIO提供了多种容量不同的Buffer,根据需要可以灵活变换。
当文件操作完成后,一定记得关闭文件输入输出流。
inChannel.close();
outChannel.close();
fis.close();
fos.close();
示例1:拷贝本地文件
public static void copyFile(String srcPath, String destPath) throws IOException {
FileInputStream fis = new FileInputStream(new File(srcPath));
FileChannel inChannel = fis.getChannel();
FileOutputStream fos = new FileOutputStream(new File(destPath));
FileChannel outChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inChannel.read(buffer) != -1) {
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
fis.close();
fos.close();
inChannel.close();
outChannel.close();
}
示例2:拷贝网络文件
public static void copyURL(String sourceUrl, String targetFile) throws IOException {
URLConnection conn = new URL(sourceUrl).openConnection();
InputStream in = conn.getInputStream();
File f = new File(targetFile);
FileOutputStream out = new FileOutputStream(f);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) >= 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
以上是关于Java高效实现大文件拷贝功能的攻略和示例,希望对你有所帮助。
本文链接:http://task.lmcjl.com/news/8074.html