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

Posted

技术标签:

【中文标题】如何在 Java 中取消 Files.copy()?【英文标题】:How to cancel Files.copy() in Java? 【发布时间】:2013-06-09 15:37:57 【问题描述】:

我正在使用 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

【讨论】:

在 Java SE 8 中,Oracle JDK 不支持此选项。或者,考虑using a FileChannel【参考方案2】:

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

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");
        
    

【讨论】:

以上是关于如何在 Java 中取消 Files.copy()?的主要内容,如果未能解决你的问题,请参考以下文章

Files.copy 是 Java 中的线程安全函数吗?

来自 Java NIO2 中的临时文件的 Files.copy 上的 AccessDeniedException

强制停止在外部线程上运行的 Java Files.copy()

如何在Java中删除图像后重命名文件并删除原始文件?

Drive.Files.Copy和“父母”无法正常工作

java IO Nio 文件拷贝工具类Files