我执行此操作时出现编译错误:
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)
sve*_*rre 16
RandomAccessFile延伸Object,但不延伸InputStream.
如果你想得到InputStream一个RandomAccessFile我认为实现一个包装类是你最简单的赌注.幸运的是,唯一的抽象方法InputStream是read().
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,但并不意味着它们可以互换.
为了构建 @robert-christian\xe2\x80\x99s 答案,首先使用的主要原因RandomAccessFile是到seek某个位置,而不是skip从某个位置 ping 字节FileInputStream. 但那为什么还要费心使用 pre-NIO API呢?
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}\nRun Code Online (Sandbox Code Playgroud)\n