0

根据Java 文档, 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 方法,当前线程将是试图向其写入更多数据的人。

那是对的吗?

4

2 回答 2

1

我认为当其他线程调用调用线程上的interrupt()方法时,会抛出FileChannel的方法transferTo()中的ClosedByInterruptException。

例如:

    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 方法。在任何给定时间,只有一项涉及通道位置或可以更改其文件大小的操作正在进行;在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成。其他操作,特别是那些采取明确立场的操作,可以同时进行;他们是否真的这样做取决于底层实现,因此未指定。

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

于 2014-11-25T19:46:52.740 回答
0

这意味着如果另一个线程中断该异常,则会引发异常。非常清楚。

它没有说明添加新数据。

于 2014-11-25T20:13:41.960 回答