用 FileChannel 拷贝文件

来源:互联网 发布:第三方辅助软件 编辑:程序博客网 时间:2024/06/06 13:56

原文链接:http://www.2cto.com/kf/201108/102100.html

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.channels.FileChannel;/** * Copy files, using two techniques, FileChannels and streams. Using * FileChannels is usually faster than using streams. */public final class CopyFiles {/* Change these settings before running this class. *//** The file to be copied. */public static final String INPUT_FILE = "C:\\TEMP\\cottage.jpg";/** * The name of the copy to be created by this class. If this file doesn't * exist, it will be created, along with any needed parent directories. */public static final String COPY_FILE_TO = "C:\\TEMP10\\cottage_2.jpg";/** Run the example. */public static void main(String... aArgs) throws IOException {File source = new File(INPUT_FILE);File target = new File(COPY_FILE_TO);CopyFiles test = new CopyFiles();test.copyWithChannels(source, target, false);// test.copyWithStreams(source, target, false);log("Done.");}/** This may fail for VERY large files. */private void copyWithChannels(File aSourceFile, File aTargetFile,boolean aAppend) {log("Copying files with channels.");ensureTargetDirectoryExists(aTargetFile.getParentFile());FileChannel inChannel = null;FileChannel outChannel = null;FileInputStream inStream = null;FileOutputStream outStream = null;try {try {inStream = new FileInputStream(aSourceFile);inChannel = inStream.getChannel();outStream = new FileOutputStream(aTargetFile, aAppend);outChannel = outStream.getChannel();long bytesTransferred = 0;// defensive loop - there's usually only a single iteration :while (bytesTransferred < inChannel.size()) {bytesTransferred += inChannel.transferTo(0,inChannel.size(), outChannel);}} finally {// being defensive about closing all channels and streamsif (inChannel != null)inChannel.close();if (outChannel != null)outChannel.close();if (inStream != null)inStream.close();if (outStream != null)outStream.close();}} catch (FileNotFoundException ex) {log("File not found: " + ex);} catch (IOException ex) {log(ex);}}public void copyWithStreams(File aSourceFile, File aTargetFile,boolean aAppend) {log("Copying files with streams.");ensureTargetDirectoryExists(aTargetFile.getParentFile());InputStream inStream = null;OutputStream outStream = null;try {try {byte[] bucket = new byte[32 * 1024];inStream = new BufferedInputStream(new FileInputStream(aSourceFile));outStream = new BufferedOutputStream(new FileOutputStream(aTargetFile, aAppend));int bytesRead = 0;while (bytesRead != -1) {bytesRead = inStream.read(bucket); // -1, 0, or moreif (bytesRead > 0) {outStream.write(bucket, 0, bytesRead);}}} finally {if (inStream != null)inStream.close();if (outStream != null)outStream.close();}} catch (FileNotFoundException ex) {log("File not found: " + ex);} catch (IOException ex) {log(ex);}}private void ensureTargetDirectoryExists(File aTargetDir) {if (!aTargetDir.exists()) {aTargetDir.mkdirs();}}private static void log(Object aThing) {System.out.println(String.valueOf(aThing));}}


0 0
原创粉丝点击