如何在Java中取消Files.copy()?
我正在使用Java NIO来复制一些东西:
Files.copy(source, target);
但我想让用户能够取消此功能(例如,如果文件太大并且需要一段时间)。
我应该怎么做?
我正在使用Java NIO来复制一些东西:
Files.copy(source, target);
但我想让用户能够取消此功能(例如,如果文件太大并且需要一段时间)。
我应该怎么做?
使用选项 。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 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");
}
}
}