Why cant a RandomAccessFile be casted to Inputstream?

后端 未结 4 2019
灰色年华
灰色年华 2021-01-12 18:03

I get compilation error when I do this cast:

RandomAccessFile raf = new RandomAccessFile(...)
InputStream is = (InputStream)raf;

Rand

相关标签:
4条回答
  • 2021-01-12 18:36

    To build on @robert-christian’s answer, the main reason to use RandomAccessFile to begin with is to seek to some position, rather than skipping bytes from a FileInputStream. But then why bother with pre-NIO APIs at all?

    try (FileChannel ch = FileChannel.open(Paths.get(…), StandardOpenOption.READ)) {
        InputStream is = Channels.newInputStream(ch.position(…));
        // …
    }
    
    0 讨论(0)
  • 2021-01-12 18:49

    RandomAccessFile extends Object, and does not extend InputStream.

    If you want get an InputStream from a RandomAccessFile I think implementing a wrapper class is your simplest bet. Luckily the only abstract method of InputStream is read().

    RandomAccessFile implements DataInput which inturn DataInputstream & InputStream

    DataInputStream is a subclass of InputStream, which also happens to implement DataInput. The inheritance and interface implementation tree looks like this:

               InputStream      DataInput
                   \              /   \
                    \            /     \
                     \          /       \
                    DataInputStream   RandomAccessFile
    

    You could use a DataInputStream anywhere where you could use an InputStream or a DataInput. You could use a RandomAccessFile anywhere where you could use a DataInput.

    But you can't go up and then down in the inheritance hierarchy like this using casts. In particular, casting a class to a subclass (or an interface to an implementation) will raise a ClassCastException unless the object happens to be an instance of the child class.

    Even though two classes happen to extend Object that doesn't mean they are interchangeable.

    0 讨论(0)
  • 2021-01-12 18:50

    This is easily achievable using the Channels utility class...

    // 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());
    
    0 讨论(0)
  • 2021-01-12 18:59

    RandomAccessFile is supposed to extends InputStream although not directly.

    No it isn't. See the Javadoc.

    From docs:

    RandomAccessFile implements DataInput which in turn DataInputstream & InputStream.

    That's not 'from the docs' at all. You made it up. What you've written doesn't even make sense. DataInput is an interface. DataInputStream and InputStream are classes. Interfaces don't implement, or extend, classes.

    What the Javadoc actuallys says is that RandomAccessFile extends java.lang.Object and implements Closeable, DataInput, DataOutput.

    0 讨论(0)
提交回复
热议问题