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 too big and it's taking a while).
How should I do this?
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.
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");
        }
    }
}
