Я думаю, что ClosedByInterruptException в методе transferTo() FileChannel вызывается, когда другой поток вызывает метод прерывания() при вызове потока.
Например:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
public class Test {
public static void main(final String[] args) throws Exception {
final RandomAccessFile fromFile = new RandomAccessFile("d:/pp.dat", "rw");
final FileChannel fromChannel = fromFile.getChannel();
final RandomAccessFile toFile = new RandomAccessFile("d:/out.dat", "rw");
final FileChannel toChannel = toFile.getChannel();
final long position = 0;
final long count = fromChannel.size();
final Runnable r = new Runnable() {
@Override
public void run() {
try {
fromChannel.transferTo(position, count, toChannel);
} catch (final IOException e) {
e.printStackTrace();
}
}
};
final Thread t = new Thread(r);
t.start();
t.interrupt();
}
}
, относящиеся к вопросу вы делаете о другой нити письменной форме по совместительству (если я правильно понимаю ваш вопрос), из документации:
Файловые каналы безопасны для использования несколькими одновременно потоки. Метод close может быть вызван в любое время, как определено интерфейсом канала. Только одна операция, которая связана с положением канала или может изменить размер его файла, может выполняться в любой момент времени; попытки инициировать вторую такую операцию, в то время как первая все еще продолжается, блокируется до завершения первой операции. Другие операции, в частности те, которые занимают явное положение, могут продолжаться одновременно; независимо от того, действительно ли они делают это, зависит от основной реализации и поэтому не указывается.
Вид файла, предоставленного экземпляром этого класса, гарантированно совместим с другими представлениями того же файла, предоставленными другими экземплярами в той же программе. Однако представление, предоставленное экземпляром этого класса, может или не может быть совместимо с представлениями, просматриваемыми другими одновременно выполняемыми программами из-за кэширования, выполняемыми базовой операционной системой, и задержками, вызванными протоколами сетевой файловой системы. Это верно независимо от языка, на котором написаны эти другие программы, и работают ли они на одном компьютере или на какой-либо другой машине. Точный характер любых таких несоответствий зависит от системы и поэтому неуточнен.
, так что вы говорите, что он будет работать отлично для моего вопроса сценария? Еще один поток будет метод transferTO Filechannel Текущий поток будет тем, кто пытается записать в него больше данных. – fscore
это исключение возникает, когда другой поток прерывает вас – rafalopez79
Но исключение, очевидно, произойдет, когда вы явно перехватите его, но произойдет ли это с моим сценарием в вопросе, а если нет, то что произойдет в этом случае? – fscore