Copying a file means creating a duplicate file at some other location. Copying involves reading a file and writing its contents to a new location.
This article will explain 7 different ways to copy a file in java with examples.
1. Using input and output streams
Use a java.io.InputStream to read a file.
Read the file using its read() method. This method accepts a byte array as argument, reads the file and places the data read into this byte array.read() returns the number of bytes read or -1 if there are no bytes left to read. Thus, loop till read() method returns -1 and in every iteration, write the contents of the byte array to an output stream. Example,
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;
public class FileCopyExample {
public static void main(String[] args) throws IOException {
String sourceFilePath = "E:/Test/demo.xml";
String targetPath = "E:/Test/nested/demo.xml";
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetPath);
InputStream inputStream = null;
OutputStream outputStream = null;
try {
// initialize input and output streams
inputStream = new FileInputStream(sourceFile);
outputStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024];
int numberOfBytes = 0;
// read file
while ((numberOfBytes = inputStream.read(buffer)) != -1) {
// write content
outputStream.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// close streams
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
} Since java.io.InputStream is an abstract class, you need to create an object of java.io.FileInputStream which is its child class. Similar is the case with java.io.OutputStream.
This method can be used to copy text file as well as binary files such as images, songs, video, keystore files etc.
2. Using FileReader
java.io.FileReader class can be used to reading a file.
It has a read() method which accepts a char[] as argument, reads the file content into this array and returns -1 when there is no content to read.
Loop over read() method till it returns -1 and in every iteration, write the contents of char array using java.io.FileWriter class.
This class has a write() method which takes a character array as argument and writes it to a file. Example,
import java.io.FileReader;
import java.io.FileWriter;
import java.io.File;
public class FileCopyExample {
public static void main(String[] args) throws IOException {
String sourceFilePath = "E:/Test/demo.xml";
String targetPath = "E:/Test/nested/demo.xml";
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetPath);
FileReader reader = null;
FileWriter writer = null;
try {
// initialize reader and writer
reader = new FileReader(sourceFile);
writer = new FileWriter(targetFile);
// array to hold file contents
char[] buffer = new char[1024];
int numberOfBytes = 0;
// read file
while ((numberOfBytes = reader.read(buffer)) != -1) {
// write content
writer.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// close reader and writer
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
}
}
} Note that java.io.FileReader and java.io.FileWriter classes are concrete classes, hence you can directly create their objects using new operator.
This method can only be used to copy text files but not binary files.
3. Using BufferedReader
This method is similar to the above method in that it can also be used to read only text files.
Above method would read the file on a character by character basis while this method can read the file line by line.
java.io.BufferedReader class has a readLine method which reads a line of file at a time. This method returns null if there is nothing to read.
Similarly, java.io.BufferedWriter class has a write method which accepts a String as argument. Output of by readLine method can be supplied to the write method. Example,
import java.io.FileReader;
import java.io.FileWriter;
import java.io.File;
import java.io.BufferedReader;
import java.io.BufferedWriter;
public class FileCopyExample {
public static void main(String[] args) throws IOException {
String sourceFilePath = "E:/Test/demo.xml";
String targetPath = "E:/Test/nested/demo.xml";
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetPath);
FileReader reader = null;
FileWriter writer = null;
BufferedReader bReader = null
try {
// initialize reader
reader = new FileReader(sourceFile);
// initialize buffered reader
bReader = new BufferedReader(reader);
// initialize writer
writer = new FileWriter(targetFile);
// initialize buffered writer
bWriter = new BufferedWriter(reader);
// array to hold file contents
String line = null;
// read file line by line
while ((line = bReader.readLine()) != -1) {
// write content
bWriter.write(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// close reader and writer
if (bReader != null) {
bReader.close();
}
if (bWriter != null) {
bWriter.close();
}
}
}
} java.io.BufferedReader is a wrapper around a reader. Thus, you need to supply a java.io.FileReader object while creating its object. File reader object points to the actual file as shown above.
Similarly, java.io.BufferedWriter accepts an object of java.io.FileWriter which points to the actual file written.
4. Using java 7 nio
java.nio.file.Files class was added in java 7 and belongs to java.nio package. It has a copy method which takes two arguments of type java.nio.file.Path representing the source and destination files.
Below is an example program to copy file from one location to another in java.
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileCopyExample {
public static void main(String[] args) throws IOException {
String sourceFilePath = "E:/Test/demo.xml";
String targetPath = "E:/Test/nested/demo.xml";
// create path object
Path sourcePath = Paths.get(sourceFilePath);
Path targetPath = Paths.get(targetFilePath);
// copy file
Files.copy(sourcePath, targetPath);
}
} 5. Using Apache Commons IO
Apache Commons IO Library has org.apache.commons.io.FileUtils class having a copyFile() method.
This method takes two java.io.File objects as arguments which represent the source and destination files respectively and copies the file. Example,
import java.io.File;
import org.apache.commons.io.FileUtils;
public class FileCopyExample {
public static void main(String[] args) throws IOException {
String sourceFilePath = "E:/Test/demo.xml";
String targetPath = "E:/Test/nested/demo.xml";
// create file objects
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetPath);
// copy file
FileUtils.copyFile(sourceFile, targetFile);
}
} For adding Apache Commons Library to your project, add the following dependency as per the build tool being used.
<!– Maven –>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
// Gradle
compile group: ‘org.apache.commons’, name: ‘commons-io’, version: ‘1.3.2’
6. Using Guava Library
Guava library has a class com.google.common.io.Files having a copy() method.
This method accepts two arguments of type java.io.File, one representing the source file and second is the destination file.
import java.io.File;
import com.google.common.io.Files;
public class FileCopyExample {
public static void main(String[] args) throws IOException {
String sourceFilePath = "E:/Test/demo.xml";
String targetPath = "E:/Test/nested/demo.xml";
// create file objects
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetPath);
// copy file
Files.copy(sourceFile, targetFile);
}
} In all the above methods, it is not necessary to create the copied file with the same name, you can also change the name of destination file.
In order to use this library, add a dependency as per the build tool below.
<!– Maven –>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
// Gradle
compile group: ‘com.google.guava’, name: ‘guava’, version: ‘28.1-jre’
Conclusion
You can choose any of the above methods to copy file from one location to another as per the requirement.
If the files are binary, then go with streams.
If the file to be copied is a text file and your project allows you to use external libraries, then go with Apache Commons or Guava, otherwise use java nio or Reader classes.