Java 为什么不能将随机访问文件强制转换为Inputstream?

Java 为什么不能将随机访问文件强制转换为Inputstream?,java,java-io,Java,Java Io,执行此强制转换时出现编译错误: RandomAccessFile raf = new RandomAccessFile(...) InputStream is = (InputStream)raf; RandomAccessFile应该是InputStream的子类,尽管不是直接的 从文档: RandomAccessFile实现了DataInput中的DataInputstream和InputStream 为什么这是无效的 另外,感谢您对如何正确使用RandomAccessFile作为Inpu

执行此强制转换时出现编译错误:

RandomAccessFile raf = new RandomAccessFile(...)
InputStream is = (InputStream)raf;
RandomAccessFile
应该是
InputStream
的子类,尽管不是直接的

从文档:

RandomAccessFile
实现了
DataInput
中的
DataInputstream
InputStream

为什么这是无效的

另外,感谢您对如何正确使用
RandomAccessFile
作为
InputStream

我正在考虑包装器方法。

扩展
对象
,而不扩展
输入流

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

RandomAccessFile实现了DataInput,它插入DataInputstream和InputStream

DataInputStream
InputStream
的一个子类,它也碰巧实现了
DataInput
。继承和接口实现树如下所示:

           InputStream      DataInput
               \              /   \
                \            /     \
                 \          /       \
                DataInputStream   RandomAccessFile
您可以在任何可以使用
输入流
数据输入
的地方使用
数据输入流
。您可以在任何可以使用数据输入的地方使用
RandomAccessFile

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

即使两个类碰巧扩展了
对象
,但这并不意味着它们可以互换

RandomAccessFile应该扩展InputStream,但不是 直接的

不,不是。请参阅Javadoc

从文档:

RandomAccessFile
实现
DataInput
,这反过来又
DataInputstream
InputStream。

这根本不是“来自文档”。是你编的。你写的东西根本没有意义<代码>数据输入是一个接口
DataInputStream
InputStream
是类。接口不实现或扩展类


Javadoc实际上说的是,
RandomAccessFile
扩展了
java.lang.Object
并实现了
Closeable、DataInput、DataOutput
,使用Channel实用程序类很容易实现这一点

// 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());

基于@robert christian的答案,首先使用
RandomAccessFile
的主要原因是
seek
到某个位置,而不是
skip
FileInputStream
ping字节。但是为什么还要为NIO之前的API而烦恼呢

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

RandomAccessFile
的要点在于它不是一个流(它不是顺序的)。你为什么要改变这一点?只需制作一个
FileInputStream
。您所说的“文件缓存不受RAF干扰…”是什么意思?此代码的最终目标是什么?如果你想帮助解决问题,你需要告诉细节。考虑一下这个链接,它包含了如何使论坛问题更容易回答的重要提示。“杰夫瑞,这是无知的……”案件很多。例如,如果您使用apache commons中使用
InputStream
IOUtils.copyragle
,那么您可以查找
RandomAccessFile
,然后创建包装器
InputStream
,但同样没有理由不能
RandomAccessFile
扩展
InputStream
…sverre,谢谢你回答我愚蠢的问题。我没有正确阅读层次结构。使用通道实用程序类很容易实现…//步骤1:创建随机访问文件只读随机访问文件raf=new RandomAccessFile(“/text.txt”,“r”);//步骤2:使用通道转换为InputStream InputStream is=Channels.newInputStream(raf.getChannel());(单独回答)@dpg我觉得读取完成后它会关闭流,如果从文件数据输入接口读取,情况并非如此。该
InputStream
是否具有任何类型的缓冲区,如果是,则在
RandomAccessFile
中的位置更改后缓冲区是否失效/刷新?