• Java几种文件拷贝方式


    第一种

    使用 java.io 包下的库,使用 FileInputStream 读取,再使用 FileOutputStream写出。
    1. import java.io.FileInputStream;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. public class FileCopy {
    5. public static void main(String[] args) {
    6. String sourceFilePath = "source.txt";
    7. String targetFilePath = "target.txt";
    8. try (FileInputStream inputStream = new FileInputStream(sourceFilePath);
    9. FileOutputStream outputStream = new FileOutputStream(targetFilePath)) {
    10. byte[] buffer = new byte[4096];
    11. int bytesRead;
    12. while ((bytesRead = inputStream.read(buffer)) != -1) {
    13. outputStream.write(buffer, 0, bytesRead);
    14. }
    15. System.out.println("文件拷贝完成");
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. }

    第二种

    利用 java.nio 包下的库,使用 transferTo 或 transfFrom 方法实现。
    1. import java.io.IOException;
    2. import java.nio.channels.FileChannel;
    3. import java.nio.file.Path;
    4. import java.nio.file.Paths;
    5. public class FileCopy {
    6. public static void main(String[] args) {
    7. String sourceFilePath = "source.txt";
    8. String targetFilePath = "target.txt";
    9. Path sourcePath = Paths.get(sourceFilePath);
    10. Path targetPath = Paths.get(targetFilePath);
    11. try (FileChannel sourceChannel = FileChannel.open(sourcePath);
    12. FileChannel targetChannel = FileChannel.open(targetPath)) {
    13. long transferredBytes = sourceChannel.transferTo(0, sourceChannel.size(), targetChannel);
    14. System.out.println("文件拷贝完成,已传输 " + transferredBytes + " 字节");
    15. } catch (IOException e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. }

    第三种

    Java 标准类库本身已经提供了 Files.copy 的实现。

    1. import java.io.IOException;
    2. import java.nio.file.Files;
    3. import java.nio.file.Path;
    4. import java.nio.file.Paths;
    5. public class FileCopy {
    6. public static void main(String[] args) {
    7. String sourceFilePath = "source.txt";
    8. String targetFilePath = "target.txt";
    9. Path sourcePath = Paths.get(sourceFilePath);
    10. Path targetPath = Paths.get(targetFilePath);
    11. try {
    12. Files.copy(sourcePath, targetPath);
    13. System.out.println("文件拷贝完成");
    14. } catch (IOException e) {
    15. e.printStackTrace();
    16. }
    17. }
    18. }

    哪一种效率最高

    对于 Copy 的效率,这个其实与操作系统和配置等情况相关,在传统的文件 IO 操作里面,我们都是调用操作系统提供的底层标准 IO 系统调用函数read()、write() ,由于内核指令的调用会使得当前用户线程切换到内核态,然后内核线程负责把相应的文件数据读取到内核的 IO 缓冲区,再把数据从内核IO缓冲区拷贝到进程的私有地址空间中去,这样便完成了一次IO操作。而 NIO 里面提供的 NIO transferTo 和 transfFrom 方法,也就是常说的零拷贝实现。它能够利用现代操作系统底层机制,避免不必要拷贝和上下文切换,因此在性能上表现比较好 
    零拷贝(Zero-Copy)是一种优化文件复制操作的技术,它通过减少数据在内核空间和用户空间之间的传输次数来提高性能。
  • 相关阅读:
    中文版-Chat GPT-4.0可用,功能更强大!(附网址)
    PHP代码审计系列(一)
    【vue】使用less报错:显示this.getOptions is not a function
    x64dbg 基本使用技巧
    [蓝桥杯 2022 省 B] 刷题统计
    c++成员变量和函数的储存
    Java SpringBoot VIII
    树形DP讲解
    MongoDB
    排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/133821154