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
中的位置更改后缓冲区是否失效/刷新?