Java中如何复制文件

后端 潘老师 6个月前 (10-19) 135 ℃ (0) 扫码查看

在应用程序中,将文件从一个位置复制到另一个位置是一个常见的任务。在这个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),我们必须依赖于上述列出的技术。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/9918.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】