2011-10-02 106 views
2
public void readFields(DataInput in) throws IOException{ 
    //How can I set up the byteArray size here? 
    //DataInput does not have available() or length() method. 
    byte[] videoByteArray = new byte[size]; 
    in.readFully(videoByteArray); 
} 

如何知道DataInput的大小?在我將所有數據讀入字節數組之前,我需要先設置大小。我怎樣才能知道DataInput的大小?

+0

你不知道大小。看到下面的鏈接,不介意不同的標題。請閱讀所有的注意事項http://stackoverflow.com/questions/7576908/convert-datainput-to-datainputstream –

+0

我完全同意DataInput糟糕 - 這不是流,所以爲什麼不接口定義長度/大小的方法? ARG。 – ib84

回答

0

DataInput是用於讀取流數據的接口,即,當長度可能不被預先知道時。這個想法是在一個循環中將數據塊讀入字節數組中,直到達到最後,由EOFException指示。

+1

或read()返回-1,具體取決於您調用的方法。 – EJP

1

如果您要發送一部分數據,知道大小的最簡單方法是首先在DataOutput流中發送它。否則,你必須假設你想讀取所有的數據,直到流的結束(並且你不能發送其他東西)

+0

情況是我編寫了一個應該從Hadoop的可寫接口實現的類。在Writeable接口中,它們將方法定義爲public void readFields(DataInput in)。我必須使用它。 – swandive

+0

如果您使用的是DataInput,則所有字段都具有定義的寬度或固定的寬度。在這種情況下,您可以閱讀該消息以瞭解它是多久(或者您不需要知道)。對於readFully,您必須假定您可以通過假定消息中的固定寬度或其他信息來確定長度。否則,你必須假設你讀取了流中剩餘的所有數據,你不能使用readFully來完成這個任務。 (如mazaneicha建議) –