为什么不能将RandomAccessFile转换为Inputstream?

我执行此操作时出现编译错误:

RandomAccessFile raf = new RandomAccessFile(...) InputStream is = (InputStream)raf; 

RandomAccessFile应该是InputStream子类,尽管不是直接的。

来自docs:

RandomAccessFile实现DataInput ,它包含DataInputstreamInputStream

为什么这个无效?

还要感谢您对使用RandomAccessFile作为InputStream的正确方法的输入?

我在想包装方法。

RandomAccessFile扩展了Object ,并没有扩展InputStream

如果你想从RandomAccessFile获得一个InputStream ,我认为实现一个包装类是你最简单的选择。 幸运的是, InputStream的唯一抽象方法是read()

RandomAccessFile实现DataInput,它包含DataInputstream和InputStream

DataInputStreamInputStream的子类,它也恰好实现了DataInput 。 inheritance和接口实现树如下所示:

  InputStream DataInput \ / \ \ / \ \ / \ DataInputStream RandomAccessFile 

您可以在可以使用InputStreamDataInputStream任何位置使用DataInput 。 您可以在可以使用DataInput任何位置使用RandomAccessFile

但是你不能在inheritance层次结构中继续使用强制转换。 特别是,将类强制转换为子类(或实现的接口)将引发ClassCastException除非该对象恰好是子类的实例。

尽管两个类碰巧扩展了Object ,但并不意味着它们可以互换。

使用Channels实用程序类可以轻松实现这一点……

 // STEP 1: Create random access file read-only RandomAccessFile raf = new RandomAccessFile("/text.txt", "r"); // STEP 2: Use Channels to convert to InputStream InputStream is = Channels.newInputStream(raf.getChannel()); 

RandomAccessFile应该扩展InputStream,尽管不是直接扩展。

不,不是。 见Javadoc。

来自docs:

RandomAccessFile实现了DataInput ,而DataInputstream又是DataInputstreamInputStream.

这根本不是“来自文档”。 你成功了。 你所写的内容甚至没有意义。 DataInput是一个接口。 DataInputStreamInputStream是类。 接口不实现或扩展类。

Javadoc实际上说的是RandomAccessFile扩展了java.lang.Object并实现了Closeable, DataInput, DataOutput

为了构建@ robert-christian的答案,使用RandomAccessFile开始的主要原因是seek某个位置,而不是从FileInputStream skip ping字节。 但那么为什么要使用前NIO API呢?

 try (FileChannel ch = FileChannel.open(Paths.get(…), StandardOpenOption.READ)) { InputStream is = Channels.newInputStream(ch.position(…)); // … }