2010-09-25 68 views
10

如何尋找(更改位置)ByteArrayInputStreamjava.io)?這是如此明顯,但我似乎無法在任何地方找到一種方法(mark/reset是不夠的,我需要設置的位置在InputStream任何地方)。使用java.io尋找ByteArrayInputStream

如果不能使用java.io來完成,我必須切換到java.nio並使用ByteBuffer,我怎麼能得到類似DataOutputStream一個ByteArrayOutputStream使用java.nio包裹的東西嗎?我沒有找到任何類型的自動調整大小的緩衝區。

編輯:我發現了一種方法來實現我正在嘗試做的事情,但它有點混亂。 ImageIO.createImageInputStream創建了一個ImageInputStream,這正是我想要的(可以查找和讀取原語)。但是,使用ByteArrayInputStream將返回FileCacheImageInputStream,這意味着它將字節數組複製到一個文件中以進行查找。

這是我第一次嘗試使用Java IO類,它已經完全消極。它缺少一些基本的(IMO)功能,並且有很多方法可以做同樣的事情(例如從文件中讀取原始文件,您可以使用RandomAccessFile,DataInputStream + FileInputStream,FileImageInputStream,FileChannel + ByteBuffer,甚至更多)。

+0

你看到使用'seek'有什麼問題嗎? – 2010-09-25 06:27:46

+4

@Vilay Mathew:什麼'尋找'方法?我沒有看到任何ByteArrayInputStream。 – asdfghjkl 2010-09-25 07:16:58

+0

java中的文件I/O是一個巨大的混亂。我把它教給一年級學生,並試圖簡化它,但這總是一個混亂點。 – Fixee 2013-09-17 03:09:45

回答

8

您會使用reset()/skip()。我不能說這是世界上最好的API,但它應該工作:

public void seek(ByteArrayInputStream input, int position) 
    throws IOException 
{ 
    input.reset(); 
    input.skip(position); 
} 

當然,那假設沒有人呼籲mark()

+0

如果標記未被調用,則標記位置的默認值爲0,因此調用reset將指針移動到0,然後跳過函數將指針移動到給定位置 – 2015-11-05 19:44:48

+0

@SumitKumarSaha:是的......我不確定你的評論。 – 2015-11-05 19:45:49

+0

我只是把你的答案加起來 – 2015-11-05 22:07:14

1

有一個ByteArrayInputStream(byte(), int, int)構造函數,它將爲您提供一個輸入流,該輸入流將從給定的偏移量開始讀取給定的字節數。您可以使用它來模擬查找流中的任意偏移量。

你必須處理「尋求」給你一個新的流對象的事實,這可能會很尷尬。但是,這種方法不涉及複製任何字節或將它們保存到文件,並且不應該打擾關閉ByteArrayInputStream對象。

4

如果您正在創建ByteArrayInputStream以通過別處,請根據需要擴展該類並操作posprotected的成員ByteArrayInputStream)。