文
章
目
录
章
目
录
在应用程序中,将文件从一个位置复制到另一个位置是一个常见的任务。在这个Java教程中,我们将看到在Java中复制文件的不同方法。
请注意,文件复制不是一个原子操作 – 在发生I/O错误、断电、进程终止或其他问题的情况下,复制操作将不会完成。如果我们需要防范这些情况,我们应该采用其他文件级别的同步措施。
在所有给定的示例中,我们将复制testoriginal.txt的内容到另一个文件testcopied.txt。文件的名称和位置可以在任何示例中进行替换。
1.使用NIO中的Files.copy()
Files类位于java.nio.file包中。它提供了在文件、目录或其他类型的文件上操作的静态方法。
- 默认情况下,如果目标文件已经存在或者是一个符号链接,则复制操作将失败,除非源文件和目标文件是相同的文件,在这种情况下,该方法将在不复制文件的情况下完成。
- 如果文件是一个目录,它会在目标位置创建一个空目录(目录中的条目不会被复制)。
使用一个或多个CopyOption枚举来控制复制的方式。
- REPLACE_EXISTING:将替换任何现有的目标文件。
- COPY_ATTRIBUTES:从源文件复制文件属性到目标文件。
- NOFOLLOW_LINKS:如果文件是一个符号链接,则复制的是符号链接本身,而不是链接的目标。
Path source = Paths.get("c:/temp/testoriginal.txt");
Path target = Paths.get("c:/temp/testcopied.txt");
Files.copy(source, target, StandardOption.REPLACE_EXISTING);
2.使用FileChannel的transferTo()
如果你喜欢FileChannel类因为它们的出色性能,可以使用这种方法。这里的关键优势在于,如果有的话,JVM将使用操作系统对DMA(直接内存访问)的访问。
使用这种技术,数据直接从磁盘传输到总线,然后传输到目的地…绕过了任何通过RAM或CPU的电路。
File fileTo = new File("c:/temp/testoriginal.txt");
FileInputStream inputStream = new FileInputStream(fileToCopy);
FileChannel inChannel = inputStream.getChannel();
File newFile = new File("c:/temp/testcopied.txt");
FileOutputStream outputStream = new FileOutputStream(newFile);
FileChannel outChannel = outputStream.getChannel();
inChannel.transferTo(0, fileToCopy.length(), outChannel);
inputStream.close();
outputStream.close();
3.使用Commons IO中的FileUtils
要使用Apache Commons IO,我们需要下载commons-io依赖并将其包含在项目中。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
使用以下类之一将一个文件复制到另一个文件。
- FileUtils – 在内部使用了java.nio.file.Files类,因此它相当于使用java.nio.file.Files.copy()函数。
- IOUtils – 它将字节从一个大型(超过2GB)的InputStream复制到一个OutputStream。此方法使用提供的缓冲区,因此不需要使用BufferedInputStream。
File fileTo = new File("c:/temp/testoriginal.txt");
File newFile = new File("c:/temp/testcopied.txt");
FileUtils.copyFile(fileToCopy, newFile);
// 或
IOUtils.copy(new FileInputStream(fileToCopy), new FileOutputStream(newFile));
4.使用Guava中的Files
要使用Guava,我们需要下载com.google.guava依赖并将其包含在项目中。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
Files类提供了用于处理文件的实用方法。Files.copy()方法将一个文件的所有字节复制到另一个文件中。
File fileTo = new File("c:/temp/testoriginal.txt");
File newFile = new File("c:/temp/testcopied.txt");
Files.copy(fileToCopy, newFile);
在Java 7之后,Java IO包没有进行过重大改进。因此,对于任何后续的Java版本(从Java 8到Java 14),我们必须依赖于上述列出的技术。