2014-06-23 49 views
2

我必須以小端順序編寫一個整數。所以我創建了一個類(這個類沒有擴展任何東西),它帶有一個FileChannel屬性和一些寫入方法。FileChannel不會寫任何東西

但有一個問題:只有一種方法可行,其他不行!

這裏的工作方法(DIS是FileChannel):

public void writeBuffer(ByteArrayOutputStream t) throws IOException 
{ 
    ByteBuffer buffer=ByteBuffer.wrap(t.toByteArray()); 
    dis.write(buffer); 
} 

這是寫方法不起作用一個:

public void writeInt(int t) throws IOException 
{ 
    ByteBuffer buffer=ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); 
    buffer.putInt(t); 
    dis.write(buffer); 
} 

我調試的程序和DIS .write(buffer)返回0,那有什麼問題?

有沒有人知道在小端編寫4字節整數的替代方法?

+1

如果我記得正確,你需要[翻轉緩衝區](http://stackoverflow.com/questions/14792968)。番石榴有一些小端流。 – McDowell

+0

不,我檢查了調試器,命令是正確的... –

+0

[flip](http://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#flip-- )不影響字節順序 - 它將緩衝區從寫入切換到讀取。 – McDowell

回答

3

創建字節緩衝區時(例如ByteBuffer.wrapByteBuffer.allocate),它的位置爲零。在第二種方法中,您調用putInt,它將ByteBuffer的位置提前到4(緩衝區的末尾),因此ByteBuffer報告沒有更多的字節要讀取。

有許多方法可以重置緩衝區的位置。正如評論所述,flip可能是最好的選擇,因爲它專門用於在將數據放入緩衝區並希望其他代碼開始讀取數據時調用。