14

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

Files.copy(source, target);

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

我该怎么做?

4

2 回答 2

30

使用选项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.

于 2013-06-13T09:41:45.913 回答
1

对于 Java 8(以及任何没有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");
        }
    }
}
于 2018-08-21T12:03:01.653 回答