Filechannel transferTO的Java doc规范

时间:2014-11-25 18:52:52

标签: java file nio filechannel

根据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方法尝试复制内容,则会抛出异常。

下面, 另一个线程是Filechannel的transferTO方法 当前线程将是谁试图向其写入更多数据。

这是对的吗?

2 个答案:

答案 0 :(得分:1)

我认为FileChannel的方法transferTo()中的ClosedByInterruptException 当其他线程调用调用线程上的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:

多个并发线程可以安全地使用文件通道。可以在Channel接口指定的任何时间调用close方法。在任何给定时间,只有一个涉及通道位置或可以更改其文件大小的操作可能正在进行中;在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成。其他操作,特别是那些采取明确立场的操作,可以同时进行;他们实际上是否这样做取决于基本的实施,因此没有具体说明。

此类实例提供的文件视图保证与同一程序中其他实例提供的同一文件的其他视图一致。然而,由于底层操作系统执行的高速缓存和网络文件系统协议引起的延迟,该类实例提供的视图可能会也可能不会与其他同时运行的程序所看到的视图一致。无论这些其他程序的编写语言是什么,以及它们是在同一台机器上运行还是在其他机器上运行,都是如此。任何此类不一致的确切性质都取决于系统,因此未指定。

答案 1 :(得分:0)

这意味着如果另一个线程中断了这个异常,则抛出异常。这很清楚。

没有提及添加新数据的内容。