2011-01-13 91 views
0

我嘗試通過ByteBuffer訪問byte []以表​​示我定義的文件類型。 byte []中的第一個位置包含一些元數據,並通過位操作進行處理。所以它們根本不代表字符。用ByteBuffer處理byte []

我想在某個固定位置添加文件數據(字符)。

byte[] file_portion包含大文件的一部分:開始部分。其中包含元數據頭。 content是一個包含我想要添加到該緩衝區的信息的字符串。 start_pos是保存來自內容的新文件數據的第一個位置。

ByteBuffer my_content = ByteBuffer.allocate(this.file_portion.length); 
content_buffer.wrap(this.file_portion); 

for (int i = 0; i < content.length(); i++) { 
    char tmp = content.toCharArray()[i]; 
    my_content.put(this.start_pos + i, (byte) tmp) 
} 

如果我重新映射這個我得到一個垃圾emptyness:

CharBuffer debug = my_content.asCharBuffer(); 
System.out.println("debug " + debug); 

我能理解,如果第一位置顯示損壞的字符...但沒有一個位置是正確的。

+2

除了這個bug,'content.toCharArray()[i]'很醜,你在每次循環迭代中都分配一個新的char數組。在外部構建char數組,或使用'content.charAt(i)' – leonbloy

回答

2

如果要將字符添加到ByteBuffer並期望它們可以用CharBuffer視圖進行讀取,則應該使用putChar(...)not put(...)。

編輯:根據OP評論。

例如:

char[] chars = content.toCharArray(); // removed from loop per leonbloy's excellent comment 
CharBuffer cbuf = my_content.asCharBuffer(); 

for (int i = 0; i < content.length(); i++) { 
    cbuf.putChar(chars[i]); 
} 

CharBuffer debug = my_content.asCharBuffer(); 
System.out.println(debug); 

my_content.position(my_content.position() + 2*chars.length); 

否則的CharBuffer正在讀您的兩個連續字節作爲單個字符。 現在,cbuf緩衝區將開始在字節緩衝區停止的同一點加載字符。加載所有字符後,原來的ByteBuffer將被定位到下一個位置。希望這是你要找的。

+0

.flip()看起來非常有用。但我仍然需要在特定位置添加字符。如果我用my_content.setPosition(this.start_pos + i)或甚至+ i + 1來做到這一點,整個轉換就會被破壞。 – wishi

+1

我想我要說的是,你需要讓緩衝區爲你做兩件事,讓你的生活更輕鬆。 1)管理緩衝區中的位置,2)管理正在讀取/寫入的項目的數據格式。在你原來的代碼中,你試圖做到這一點,並因此而遇到問題。 –

+0

非常感謝您的努力。你是絕對正確的:在這裏管理職位是有問題的,我必須分開這個。我仍然有問題,從位置0填充cbuf。我需要從位置n開始填充它。每次我這樣做時,整個東西都會被損壞。 :( – wishi

1

您是否知道在Java中char佔用兩個字節?