I\'m using Java NIO to copy something:
Files.copy(source, target);
But I want to give users the ability to cancel this (e.g. if the file is
For Java 8 (and any java without ExtendedCopyOption.INTERRUPTIBLE
), this will do the trick:
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");
}
}
}
Use the option ExtendedCopyOption.INTERRUPTIBLE
.
Note: This class may not be publicly available in all environments.
Basically, you call Files.copy(...)
in a new thread, and then interrupt that thread with Thread.interrupt()
:
Thread worker = new Thread() {
@Override
public void run() {
Files.copy(source, target, ExtendedCopyOption.INTERRUPTIBLE);
}
}
worker.start();
and then to cancel:
worker.interrupt();
Notice that this will raise a FileSystemException
.