Спецификация документа Java для Filechannel transferTO

Согласно Java doc, ClosedByInterruptException генерируется, когда:

  @throws  ClosedByInterruptException
         If another thread interrupts the current thread while the
         transfer is in progress, thereby closing both channels and
         setting the current thread's interrupt status

Я хочу получить некоторые разъяснения. Например, есть файл, который время от времени расширяется по мере добавления в его конец новых данных. В этом случае означает ли приведенная выше строка, что будет выдано исключение, если во время добавления новых данных метод transferTO из FileChannel попытается скопировать содержимое.

Здесь другим потоком будет метод TransferTO канала Filechannel. Текущим потоком будет тот, кто пытается записать в него больше данных.

Это правильно?


person fscore    schedule 25.11.2014    source источник


Ответы (2)


Я думаю, что 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
comment
так вы говорите, что это будет работать нормально для моего сценария вопросов? Другой поток будет методом TransferTO канала Filechannel. Текущим потоком будет тот, кто пытается записать в него больше данных. - person fscore; 25.11.2014
comment
Но исключение, очевидно, произойдет, когда вы явно прервете его, но произойдет ли это с моим сценарием в вопросе, и если нет, то что произойдет в этом случае? - person fscore; 25.11.2014
comment
Это не будет прервано. Один поток будет ждать другого, javadoc: в любой момент времени может выполняться только одна операция, которая затрагивает положение канала или может изменить размер его файла; попытки инициировать вторую такую ​​операцию во время выполнения первой блокируются до завершения первой операции. - person rafalopez79; 25.11.2014

Это означает, что исключение генерируется, если другой поток прерывает этот. Это совершенно ясно.

Он ничего не говорит о добавлении новых данных.

person user207421    schedule 25.11.2014
comment
прерывание другого потока означает ли это сценарий, который я перечислил выше, один пытается писать, а другие прерываются, пытаясь прочитать или thread.interupt - person fscore; 25.11.2014
comment
Это значит позвонить Thread.interrupt(). Запись в файл или чтение из него не является прерыванием потока. Удивительный вопрос. - person user207421; 25.11.2014
comment
Я настоятельно рекомендую вам отвечать на вопросы только тогда, когда вы можете ответить без сарказма. Каждый человек в какой-то момент является новичком, поэтому, пожалуйста, не забывайте, что вы были там в какой-то момент. Спасибо за понимание. - person fscore; 25.11.2014
comment
Настоятельно рекомендую вам не делать здесь личных замечаний. - person user207421; 28.11.2014