如何在Java中取消Files.copy()?

2022-09-03 18:02:46

我正在使用Java NIO来复制一些东西:

Files.copy(source, target);

但我想让用户能够取消此功能(例如,如果文件太大并且需要一段时间)。

我应该怎么做?


答案 1

使用选项 。ExtendedCopyOption.INTERRUPTIBLE

注意:此类可能并非在所有环境中都公开可用。

基本上,您调用一个新线程,然后用以下命令中断该线程:Files.copy(...)Thread.interrupt()

Thread worker = new Thread() {
    @Override
    public void run() {
        Files.copy(source, target, ExtendedCopyOption.INTERRUPTIBLE);
    }
}
worker.start();

然后取消:

worker.interrupt();

请注意,这将引发 .FileSystemException


答案 2

对于 Java 8(以及任何没有 的 java),这将解决问题:ExtendedCopyOption.INTERRUPTIBLE

public static void streamToFile(InputStream stream, Path file) throws IOException, InterruptedException {
    try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(file))) {
        byte[] buffer = new byte[8192];
        while (true) {
            int len = stream.read(buffer);
            if (len == -1)
                break;

            out.write(buffer, 0, len);

            if (Thread.currentThread().isInterrupted())
                throw new InterruptedException("streamToFile canceled");
        }
    }
}

推荐