2014-11-25 3 views
0

о переходе в соответствии с Java doc,ClosedByInterruptException выбрасывается при:Java спецификация документ для FileChannel

@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 

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

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

Верно ли это?

ответ

1

Я думаю, что 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 может быть вызван в любое время, как определено интерфейсом канала. Только одна операция, которая связана с положением канала или может изменить размер его файла, может выполняться в любой момент времени; попытки инициировать вторую такую ​​операцию, в то время как первая все еще продолжается, блокируется до завершения первой операции. Другие операции, в частности те, которые занимают явное положение, могут продолжаться одновременно; независимо от того, действительно ли они делают это, зависит от основной реализации и поэтому не указывается.

Вид файла, предоставленного экземпляром этого класса, гарантированно совместим с другими представлениями того же файла, предоставленными другими экземплярами в той же программе. Однако представление, предоставленное экземпляром этого класса, может или не может быть совместимо с представлениями, просматриваемыми другими одновременно выполняемыми программами из-за кэширования, выполняемыми базовой операционной системой, и задержками, вызванными протоколами сетевой файловой системы. Это верно независимо от языка, на котором написаны эти другие программы, и работают ли они на одном компьютере или на какой-либо другой машине. Точный характер любых таких несоответствий зависит от системы и поэтому неуточнен.

+0

, так что вы говорите, что он будет работать отлично для моего вопроса сценария? Еще один поток будет метод transferTO Filechannel Текущий поток будет тем, кто пытается записать в него больше данных. – fscore

+0

это исключение возникает, когда другой поток прерывает вас – rafalopez79

+0

Но исключение, очевидно, произойдет, когда вы явно перехватите его, но произойдет ли это с моим сценарием в вопросе, а если нет, то что произойдет в этом случае? – fscore

0

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

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

+0

с помощью другого потока, связанного с ним, это означает сценарий, который я перечислял выше, один пытается написать и другие interuppts, пытаясь прочитать или thread.interupt – fscore

+0

Это означает вызов 'Thread.interrupt()'. Запись в файл или чтение из него не является прерыванием потока. Удивительный вопрос. – EJP

+0

Я настоятельно рекомендую вам отвечать только на вопросы, когда вы можете ответить без сарказма. Каждый человек является новичком в какой-то момент, поэтому, пожалуйста, не забывайте, что вы были там в какой-то момент. Спасибо за понимание. – fscore

Смежные вопросы