为什么不能将RandomAccessFile转换为Inputstream?
我执行此操作时出现编译错误:
RandomAccessFile raf = new RandomAccessFile(...) InputStream is = (InputStream)raf;
RandomAccessFile
应该是InputStream
子类,尽管不是直接的。
来自docs:
RandomAccessFile
实现DataInput
,它包含DataInputstream
和InputStream
为什么这个无效?
还要感谢您对使用RandomAccessFile
作为InputStream
的正确方法的输入?
我在想包装方法。
RandomAccessFile
扩展了Object
,并没有扩展InputStream
。
如果你想从RandomAccessFile
获得一个InputStream
,我认为实现一个包装类是你最简单的选择。 幸运的是, InputStream
的唯一抽象方法是read()
。
RandomAccessFile实现DataInput,它包含DataInputstream和InputStream
DataInputStream
是InputStream
的子类,它也恰好实现了DataInput
。 inheritance和接口实现树如下所示:
InputStream DataInput \ / \ \ / \ \ / \ DataInputStream RandomAccessFile
您可以在可以使用InputStream
或DataInputStream
任何位置使用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
又是DataInputstream
和InputStream.
这根本不是“来自文档”。 你成功了。 你所写的内容甚至没有意义。 DataInput
是一个接口。 DataInputStream
和InputStream
是类。 接口不实现或扩展类。
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(…)); // … }