0

我有一个实现“可运行”以从数据流中读取数据的类。数据来自Channel作为成员变量存储在我的另一个类中的 a,我可以通过简单地调用 getter 来获取此通道的实例getInputChannel()。现在,为了让我Runnable从通道中读取数据,它需要知道它是什么类型的通道,以便它可以使用通道的read方法。通道类型可以是FileChannel或之一SocketChannel,并且在运行时决定,即

private class ReadInputStream implements Runnable {

    Thread thread;
    boolean running = true;
    ByteBuffer buffer = ByteBuffer.allocate(1024);

    FileChannel or SocketChannel channel;

    public ReadInputStream() {
        // Need to cast type channel at run time
        Channel ch = getInputChannel();
        this.channel = (FileChannel or SocketChannel) ch;
    }

    public void run() {
        while (running) {
             channel.read(buffer);
             // etc.
        }
    }

}

获得正确类型的通道以便我可以read在可运行的run()方法中实现其方法的最佳方法是什么?

4

3 回答 3

1

Java 中没有办法表达联合类型。您最好的选择是使用一些适用于两者的通用界面。

如果您仅将频道用于阅读,请将其定义为ReadableByteChannel.
如果您将其用于写作,请使用WritableByteChannel.
如果两者都需要,请使用ByteChannel.

于 2013-11-12T14:34:43.977 回答
1

FileChannel 和 SocketChannel 都实现了ByteChannel,它声明了它们的read(ByteBuffer)方法,所以这就是你getInputChannel()应该返回的类型。

编辑或者,如果您只从频道中读取内容,请按照 Darkhogg 的说明返回ReadableByteChannel 。由于这是一个输入通道,因此很可能是这种情况。

于 2013-11-12T14:35:57.177 回答
0

您可以使用简单的 if/else 子句并循环浏览可用的实例类型,例如(没有双关语......):

if (channel instanceof FileChannel)
    {
         ((FileChannel)channel).read(buffer);
    }
    else if (channel instanceof SocketChannel)
    {
        ((SocketChannel)channel).read(buffer);
    }

等等

于 2013-11-12T14:36:51.223 回答