2012-02-15 160 views
1

我得到的編譯錯誤,當我做這個轉換:爲什麼不能將RandomAccessFile轉換爲InputStream?

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

RandomAccessFile應該繼承InputStream雖然不能直接。

從文檔:

RandomAccessFile實現DataInput這inturn DataInputstream & InputStream

這是爲什麼無效?

同樣感謝您對什麼是正確的方式使用RandomAccessFile作爲InputStream的輸入?

我正在考慮包裝方法。

+1

RandomAccessFile的意思是它不是流(它不是順序的)。你爲什麼要改變它?只需製作一個'FileInputStream'。 – Jeffrey 2012-02-15 04:05:34

+1

你的「文件緩存不受RAF干擾......」是什麼意思?這段代碼的最終目標是什麼?如果您想幫助解決問題,您需要告訴詳情。考慮檢查這個鏈接[如何問問題的智能方式](http://catb.org/~esr/faqs/smart-questions.html),其中包含有關如何使論壇問題更容易回答的重要提示。 – 2012-02-15 04:32:11

+1

@傑弗裏好,那是無知......有很多情況。例如,如果你從使用'InputStream'的apache commons中使用'IOUtils.copyLarge',所以你尋找你的'RandomAccessFile',然後創建包裝'InputStream',但是沒有理由不能'RandomAccessFile'延伸' InputStream' ... – Enerccio 2017-12-19 16:03:21

回答

15

RandomAccessFile延伸Object,並延伸InputStream

如果你想從RandomAccessFile得到InputStream我認爲實現一個包裝類是最簡單的選擇。幸運的是,InputStream的唯一抽象方法是read()

的RandomAccessFile實現了DataInput中的其中inturn DataInputStream所&的InputStream

DataInputStreamInputStream一個子類,這也恰好實現DataInput。繼承和接口實現樹是這個樣子:

​​

你可以使用一個DataInputStream任何地方,你可以使用一個InputStreamDataInput。您可以在任何可以使用DataInput的地方使用RandomAccessFile

但是你不能在繼承層次結構中使用強制類型繼續下去。特別是,將類轉換爲子類(或實現的接口)將引發ClassCastException,除非該對象碰巧是子類的實例。

即使兩個類別碰巧延伸Object,這並不意味着它們可以互換。

+2

+1,34秒快 – Jeffrey 2012-02-15 04:01:31

+0

很好地完成。 1+ – 2012-02-15 04:36:39

+2

sverre,謝謝你回答我的愚蠢問題。我沒有正確讀取層次結構。 – PS1 2012-02-15 05:55:20

4

RandomAccessFile應該直接擴展InputStream,儘管不是 。

不,它不是。看到Javadoc。

從文檔:

RandomAccessFile實現DataInput這反過來DataInputstream & InputStream.

這不是 '從文檔' 可言。你做到了。你寫的東西甚至都沒有意義。 DataInput是一個界面。 DataInputStreamInputStream是類。接口不實現或擴展類。

Javadoc實際上說的是RandomAccessFile延伸java.lang.Object並實現Closeable, DataInput, DataOutput

30

這是使用渠道的實用工具類容易實現......

// 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()); 
+2

這比接受的答案更有用。 – dpg 2015-09-23 15:02:20

+0

@dpg我覺得它會在讀取完成後關閉流,如果您從文件DataInput接口讀取數據,情況並非如此。 – 2015-12-06 17:11:21

1

要建立在@羅伯特 - 基督教的回答,用RandomAccessFile開始與主要的原因是seek到某個位置,而不是skipFileInputStream ping字節。但是爲什麼還要打擾NIO之前的API呢?

try (FileChannel ch = FileChannel.open(Paths.get(…), StandardOpenOption.READ)) { 
    InputStream is = Channels.newInputStream(ch.position(…)); 
    // … 
} 
相關問題