This article shows four ways to copy a file in Java.
Files.copy(NIO)- Apache Commons IO
- Guava
- Plain Java
In Java 7+, the NIO Files.copy is the simplest way to copy a file, because it is a built-in API. Before Java 7, the Apache Commons IO FileUtils.copyFile is a preferable solution because the legacy IO java.io.* has no API to copy.
1. Files.copy (NIO)
1.1 This code snippet uses NIO to copy a file. By default, if the target file exists, the copy fails and throws FileAlreadyExistsException.
Path fromFile = Paths.get(from); Path toFile = Paths.get(to); Files.copy(fromFile, toFile);
1.2 The Files.copy takes a varargs argument:
StandardCopyOption.REPLACE_EXISTING– If target file exits, replace it.StandardCopyOption.COPY_ATTRIBUTES– Copies the file attributes to the target file.
import java.nio.file.StandardCopyOption;
// if target or destination file exists, replace it.
Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);
// multiple StandardCopyOption
CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES,
LinkOption.NOFOLLOW_LINKS };
Files.copy(fromFile, toFile, options);
1.3 Below is a complete Java NIO example to copy a file.
CopyFile1.java
package com.favtuts.io.file;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CopyFile {
public static void main(String[] args) {
String fromFile = "/home/tvt/workspace/favtuts/sample.csv";
String toFile = "/home/tvt/workspace/favtuts/backup/sample_bk_20220512.csv";
try {
copyFileNIO(fromFile, toFile);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Copy file is done.");
}
public static void copyFileNIO(String from, String to) throws IOException {
Path fromFile = Paths.get(from);
Path toFile = Paths.get(to);
// if fromFile does't exist, Files.copy throws NoSuchFileException
if (Files.notExists(fromFile)) {
System.out.println("File doesn't exist? " + fromFile);
return;
}
// if toFile folder doesn't exist, Files.copy throws NoSuchFileException
// if toFile parent folder doesn't exist, create it.
Path parent = toFile.getParent();
if (parent!=null) {
if (Files.notExists(parent)) {
Files.createDirectories(parent);
}
}
// default - if toFile exist, throws FileAlreadyExistsException
Files.copy(fromFile, toFile);
// if toFile exist, replace it.
// Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);
// multiple StandardCopyOption
/*CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES,
LinkOption.NOFOLLOW_LINKS };
Files.copy(fromFile, toFile, options);*/
}
}
2. Apache Commons IO
In the old days (before Java 7), the commons-io is the easiest solution to copy a file in Java.
pom.xml
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
import org.apache.commons.io.FileUtils;
public static void copyFileCommonIO(String from, String to)
throws IOException {
File fromFile = new File(from);
File toFile = new File(to);
FileUtils.copyFile(fromFile, toFile);
}
3. Google Guava
Many projects start to adopt Guava, and prefer the Guava’s Files.copy, the same name with the Java NIO, make sure you import the correct packages com.google.common.io.Files.
pom.xml
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
public static void copyFileGuava(String from, String to) throws IOException {
File fromFile = new File(from);
File toFile = new File(to);
// @Beta?
com.google.common.io.Files.copy(fromFile, toFile);
}
The Guava’s Files class is available since version 1.0, no idea why the Files.copy still, has a @Beta annotation on it?
Files.java
package com.google.common.io;
public final class Files {
//..
@Beta
public static void copy(File from, File to) throws IOException {
checkArgument(!from.equals(to),
"Source %s and destination %s must be different", from, to);
asByteSource(from).copyTo(asByteSink(to));
}
4. Plain Java
This example uses the plain Java InputStream and OutputStream to copy a file.
public static void copyFilePlainJava(String from, String to) throws IOException {
InputStream inStream = null;
OutputStream outStream = null;
try {
File fromFile = new File(from);
File toFile = new File(to);
inStream = new FileInputStream(fromFile);
outStream = new FileOutputStream(toFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
outStream.flush();
}
} finally {
if (inStream != null)
inStream.close();
if (outStream != null)
outStream.close();
}
}
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-io/file