Always close streams
Reading and writing binary files
Copy a directory tree
Example
import java.io.IOException; import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; /** JDK 7+. */ public final class CopyFilesNew { public static void main(String... args) throws IOException { Path FROM = Paths.get("C:\\Temp\\from.txt"); Path TO = Paths.get("C:\\Temp\\to.txt"); //overwrite existing file, if exists CopyOption[] options = new CopyOption[]{ StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES }; Files.copy(FROM, TO, options); } }In older JDKs, however, copying a file involves a lot more code. It can be done either with
FileChannel
s or
with basic streams.
The FileChannel
technique is usually faster.
Here's an example showing both techniques.
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. JDK 6-. */ 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... args) 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 source, File target, boolean append) { log("Copying files with channels."); ensureTargetDirectoryExists(target.getParentFile()); FileChannel inChannel = null; FileChannel outChannel = null; FileInputStream inStream = null; FileOutputStream outStream = null; try{ try { inStream = new FileInputStream(source); inChannel = inStream.getChannel(); outStream = new FileOutputStream(target, append); 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 streams if (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); } } private void copyWithStreams(File source, File target, boolean append) { log("Copying files with streams."); ensureTargetDirectoryExists(target.getParentFile()); InputStream inStream = null; OutputStream outStream = null; try{ try { byte[] bucket = new byte[32*1024]; inStream = new BufferedInputStream(new FileInputStream(source)); outStream = new BufferedOutputStream(new FileOutputStream(target, append)); int bytesRead = 0; while(bytesRead != -1){ bytesRead = inStream.read(bucket); //-1, 0, or more if(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 targetDir){ if(!targetDir.exists()){ targetDir.mkdirs(); } } private static void log(Object thing){ System.out.println(String.valueOf(thing)); } }