Я думаю, что ClosedByInterruptException в методе transferTo() FileChannel выбрасывается, когда другой поток вызывает метод interrupt() при вызове потока.
Например:
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();
}
}
Относительно вопроса, который вы задаете о параллельном написании другого потока (если я правильно понимаю ваш вопрос), из javadoc:
Файловые каналы безопасны для использования несколькими параллельными потоками. Метод close может быть вызван в любое время, как указано в интерфейсе канала. В любой момент времени может выполняться только одна операция, которая затрагивает положение канала или может изменить размер его файла; попытки инициировать вторую такую операцию во время выполнения первой блокируются до завершения первой операции. Другие операции, в частности те, которые принимают явное положение, могут выполняться одновременно; делают ли они это на самом деле, зависит от базовой реализации и поэтому не указано.
Представление файла, предоставляемое экземпляром этого класса, гарантированно согласуется с другими представлениями того же файла, предоставляемыми другими экземплярами в той же программе. Представление, предоставляемое экземпляром этого класса, может, однако, согласовываться или не согласовываться с представлениями, видимыми другими параллельно работающими программами, из-за кэширования, выполняемого базовой операционной системой, и задержек, вызванных протоколами сетевой файловой системы. Это верно независимо от языка, на котором написаны эти другие программы, и от того, работают ли они на той же машине или на какой-то другой машине. Точная природа любых таких несоответствий зависит от системы и поэтому не указывается.
person
rafalopez79
schedule
25.11.2014