MST

星途 面试题库

面试题:Java中使用NIO文件通道实现文件复制

请用Java的NIO文件通道实现一个文件复制的方法,源文件路径和目标文件路径作为方法参数传入。要求考虑异常处理,并说明NIO文件通道相较于传统Java文件操作的优势。
36.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

public class FileCopyUtil {
    public static void copyFile(String sourcePath, String targetPath) {
        try (FileChannel sourceChannel = FileChannel.open(Path.of(sourcePath), StandardOpenOption.READ);
             FileChannel targetChannel = FileChannel.open(Path.of(targetPath), StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (sourceChannel.read(buffer) != -1) {
                buffer.flip();
                targetChannel.write(buffer);
                buffer.clear();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

NIO文件通道相较于传统Java文件操作的优势:

  • 性能提升:NIO基于通道(Channel)和缓冲区(Buffer)进行操作,数据直接在通道和缓冲区之间传输,减少了数据在用户空间和内核空间之间的拷贝次数,对于大文件操作性能提升显著。传统I/O是基于流(Stream)的操作,每次读写都可能涉及用户空间与内核空间的数据拷贝,效率相对较低。
  • 非阻塞I/O:NIO支持非阻塞I/O操作,使得一个线程可以管理多个通道,在处理多个文件操作时,可以更灵活地利用系统资源,提高系统的并发处理能力。而传统I/O是阻塞式的,当一个线程在进行I/O操作时,该线程会被阻塞,直到操作完成,这在处理多个文件操作时可能导致线程资源的浪费。
  • 更灵活的文件操作:NIO提供了丰富的文件操作方法,如文件锁(FileLock),可以方便地实现文件的并发访问控制等高级功能,而传统I/O在这方面功能相对匮乏。