2011-04-29 54 views
2

我有一個文件,我通過'FileChannel.map()'映射到內存中。然而,它讀取字符串時,似乎有點奇怪做到以下幾點:直接將內存映射到字符串

1) read a int for the string length 
2) allocate a byte[length] object 
3) use .get to read length bytes 
4) convert the byte[] to a string 

現在,我從我的C++的背景知道,內存映射文件提供給用戶作爲內存指針。那麼是否有一種好方法可以跳過使用字節數組,並且只需要將字符串轉換從映射的內存中移出?

+0

是文件unicode? – 2011-04-29 19:49:21

+0

這是要確定在這一點上。目前它是ASCII。 – 2011-04-29 19:54:54

回答

3

我建議:

MappedByteBuffer mapped = fileChannel.map(mode, position, size); 
String s = new String(mapped.array()); 

也可以通過這種方式來使用mapped.asCharBuffer()並獲得字符。

+0

爲了防止不必要的複製到緩衝區,這是實現它的方法。當然,製作一個字符串仍然需要一個副本,就像rlibby提到的那樣。 – 2011-04-29 20:06:01

+0

...這樣他可以得到一個'UnsupportedOperationException'? 'MappedByteBuffer'不支持數組,'MappedByteBuffer.hasArray()'返回'false','MappedByteBuffer.array()'拋出上述異常。 – rlibby 2011-04-29 20:15:22

+0

這可能是真的,所以他需要使用asCharBuffer()並將每個字符讀入另一個緩衝區等構造字符串。 – Pih 2011-04-29 20:18:26

3

最終,沒有。但是有一種方法可以將數據視爲字符。看看ByteBuffer.asCharBuffer()。

在內部,asCharBuffer()方法與您提議的方法完全相同,但在逐個字符的基礎上進行。

+0

+1這是他可能希望的最好的,如果文件是ASCII,因爲Java字符串是Unicode的。 – 2011-04-29 19:58:01

1

有沒有得到周圍的字符串想要一個私人的數據副本。字符串是不可改變的,如果它使用共享數組,你可以打破它。不幸的是,沒有String(CharSequence)String(ByteBuffer)構造函數。