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

PS1*_*PS1 4 java java-io

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

RandomAccessFile raf = new RandomAccessFile(...)
InputStream is = (InputStream)raf;
Run Code Online (Sandbox Code Playgroud)

RandomAccessFile应该是子类,InputStream虽然不是直接的.

来自docs:

RandomAccessFile实现DataInput哪些内容DataInputstream&InputStream

为什么这个无效?

还要感谢您对使用RandomAccessFileas 的正确方法的输入InputStream

我在想包装方法.

Rob*_*ian 46

使用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());
Run Code Online (Sandbox Code Playgroud)

  • 这比接受的答案更有用. (5认同)

sve*_*rre 16

RandomAccessFile延伸Object,但不延伸InputStream.

如果你想得到InputStream一个RandomAccessFile我认为实现一个包装类是你最简单的赌注.幸运的是,唯一的抽象方法InputStreamread().

RandomAccessFile实现DataInput,它包含DataInputstream和InputStream

DataInputStream是一个子类InputStream,也恰好实现DataInput.继承和接口实现树如下所示:

           InputStream      DataInput
               \              /   \
                \            /     \
                 \          /       \
                DataInputStream   RandomAccessFile
Run Code Online (Sandbox Code Playgroud)

您可以在DataInputStream任何可以使用a InputStream或a 的地方使用DataInput.您可以在RandomAccessFile任何可以使用的地方使用DataInput.

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

尽管有两个类正在扩展Object,但并不意味着它们可以互换.

  • sverre,谢谢你回答我的愚蠢问题.我没有正确读取层次结构. (2认同)

Jes*_*ick 6

为了构建 @robert-christian\xe2\x80\x99s 答案,首先使用的主要原因RandomAccessFile是到seek某个位置,而不是skip从某个位置 ping 字节FileInputStream. 但那为什么还要费心使用 pre-NIO API呢?

\n\n
try (FileChannel ch = FileChannel.open(Paths.get(\xe2\x80\xa6), StandardOpenOption.READ)) {\n    InputStream is = Channels.newInputStream(ch.position(\xe2\x80\xa6));\n    // \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n