Почему файл RandomAccessFile не может быть приведен к Inputstream?

Я получаю ошибку компиляции, когда я делаю это приведение:

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

RandomAccessFile должен подклассInputStream хотя не напрямую.

Из документов:

RandomAccessFile инвентарьDataInput которые в свою очередьDataInputstream & InputStream

Почему это недействительно?

Также оцените ваш вклад в то, что было бы правильным способом использоватьRandomAccessFile какInputStream?

Я думаю о подходе оболочки.

 Jeffrey15 февр. 2012 г., 05:05
ТочкаRandomAccessFile в том, что это не поток (он не последовательный). Почему вы хотите изменить это? Просто сделайFileInputStream.
 Hovercraft Full Of Eels15 февр. 2012 г., 05:32
И что вы подразумеваете под вашим "файловый кеш не нарушен RAF ..."? Какова конечная цель этого кода? Вам нужно будет сообщить подробности, если вы хотите помочь решить проблему. Попробуйте проверить эту ссылкуКак правильно задавать вопросы который содержит отличные советы о том, как сделать ответы на вопросы на форуме более легкими.
 Enerccio19 дек. 2017 г., 17:03
@ Джеффри, ну, это невежественно ... Есть много случаев. Например, если вы используетеIOUtils.copyLarge от Apache Commons, который используетInputStreamтак что вы ищете свойRandomAccessFile а затем создать оберткуInputStreamно опять же нет никаких причин, почему не могRandomAccessFile простиратьсяInputStream...

Ответы на вопрос(4)

Этого легко достичь, используя служебный класс 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());
 PetroCliff23 сент. 2015 г., 17:02
Это более полезно, чем принятый ответ.
 Valentin Tihomirov06 дек. 2015 г., 18:11
@dpg Я чувствую, что он закроет поток после завершения чтения, что не так, если вы читаете из файлового интерфейса DataInput.
 U. Windl22 мая 2018 г., 10:06
Это делаетInputStream иметь любой вид буферизации, и если это так, является ли этот буфер недействительным / обновлен после изменения позиции вRandomAccessFile?

основной причиной использованияRandomAccessFile для начала этоseek в какую-то позицию, а неskipПинг байтов изFileInputStream, Но тогда зачем вообще использовать API до NIO?

try (FileChannel ch = FileChannel.open(Paths.get(…), StandardOpenOption.READ)) {
    InputStream is = Channels.newInputStream(ch.position(…));
    // …
}
Решение Вопроса

RandomAccessFile продолжаетсяObject, а такжене простиратьсяInputStream.

Если вы хотите получитьInputStream изRandomAccessFile Я думаю, что реализация класса-обёртки - ваша самая простая ставка. К счастью, единственный абстрактный методInputStream являетсяread().

RandomAccessFile реализует DataInput, который внутри DataInputstream & InputStream

DataInputStream это подклассInputStream, который также случается реализоватьDataInput, Дерево наследования и реализации интерфейса выглядит так:

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

Вы могли бы использоватьDataInputStream везде, где вы могли бы использоватьInputStream илиDataInput, Вы могли бы использоватьRandomAccessFile везде, где вы могли бы использоватьDataInput.

Но вы не можете подниматься и опускаться в иерархии наследования, как это, используя приведение типов. В частности, приведение класса к подклассу (или интерфейсу к реализации) вызоветClassCastException если объект не является экземпляром дочернего класса.

Даже если два класса расширяютсяObject это не значит, что они взаимозаменяемы.

 Jeffrey15 февр. 2012 г., 05:01
+1, 34 секунды быстрее
 Hovercraft Full Of Eels15 февр. 2012 г., 05:36
красиво сделано 1+
 Robert Christian29 янв. 2015 г., 20:15
Этого легко достичь, используя служебный класс Channels ... // ШАГ 1: Создать файл произвольного доступа только для чтения RandomAccessFile raf = new RandomAccessFile ("/ text.txt", "r"); // ШАГ 2. Использование каналов для преобразования в InputStream InputStream is = Channels.newInputStream (raf.getChannel ()); (ответил отдельно)
 PS115 февр. 2012 г., 06:55
Сверре, спасибо за ответ на мой тупой вопрос. Я не правильно прочитал иерархию.

что RandomAccessFile расширяет InputStream, но не напрямую.

Нет, это не так. Смотрите Javadoc.

Из документов:

RandomAccessFile инвентарьDataInput которые в свою очередьDataInputstream & InputStream.

Это совсем не из документов. Вы сделали это. То, что вы написали, даже не имеет смысла.DataInput это интерфейс.DataInputStream а такжеInputStream это классы. Интерфейсы не реализуют и не расширяют классы.

Что на самом деле говорит Javadoc, так это то, чтоRandomAccessFile продолжаетсяjava.lang.Object и реализуетCloseable, DataInput, DataOutput.

Ваш ответ на вопрос