在本文中,您将学习如何使用 Files.copy()
或 BufferedInputStream
和 BufferedOutputStream
等各种方法在 Java 中复制文件或目录。
Java NIO 的 Files.copy() 方法是在 Java 中复制文件的最简单方法。
import java.io.IOException;
import java.nio.file.*;
public class CopyFileExample {
public static void main(String[] args) {
Path sourceFilePath = Paths.get("./bar.txt");
Path targetFilePath = Paths.get(System.getProperty("user.home") + "/Desktop/bar-copy.txt");
try {
Files.copy(sourceFilePath, targetFilePath);
} catch (FileAlreadyExistsException ex) {
System.out.println("File already exists");
} catch (IOException ex) {
System.out.format("I/O error: %s%n", ex);
}
}
}
如果目标文件已经存在,Files.copy()
方法将抛出 FileAlreadyExistsException
。如果你想替换目标文件,那么你可以像这样使用 REPLACE_EXISTING
选项 -
Files.copy(sourceFilePath, targetFilePath, StandardCopyOption.REPLACE_EXISTING);
请注意,可以使用相同的方法复制目录。但是,目录中的文件不会被复制,因此即使原始目录包含文件,新目录也会是空的。
**阅读:**如何在 Java 中递归复制目录
您还可以使用字节流 I/O 逐字节复制文件。以下示例使用 BufferedInputStream
将文件读入字节数组,然后使用 BufferedOutputStream
写入字节数组。
您也可以直接使用 FileInputStream
和 FileOutputStream
来执行读写操作。但是缓冲 I/O 的性能更高,因为它缓冲数据并以块的形式读取/写入数据。
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CopyFileExample1 {
public static void main(String[] args) {
Path sourceFilePath = Paths.get("./bar.txt");
Path targetFilePath = Paths.get(System.getProperty("user.home") + "/Desktop/bar-copy.txt");
try(InputStream inputStream = Files.newInputStream(sourceFilePath);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
OutputStream outputStream = Files.newOutputStream(targetFilePath);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream)) {
byte[] buffer = new byte[4096];
int numBytes;
while ((numBytes = bufferedInputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer, 0, numBytes);
}
} catch (IOException ex) {
System.out.format("I/O error: %s%n", ex);
}
}
}