2.4.5 存取無符號數(shù)據(jù) Java 編程語言對無符號數(shù)值并沒有提供直接的支持(除了char類型)。但是在許多情況下您需要將無符號的信息轉(zhuǎn)化成數(shù)據(jù)流或者文件,或者包裝數(shù)據(jù)來創(chuàng)建文件頭或者其它帶有無符號數(shù)據(jù)區(qū)域結(jié)構(gòu)化的信息。ByteBuffer 類的 API 對此并沒有提供直接的支持,但是要實現(xiàn)并不困難。您只需要小心精度的問題。當(dāng)您必須處理緩沖區(qū)中的無符號數(shù)據(jù)時,例 2-3中的工具類可能會非常有幫助。
例 2-3. 獲取/存放無符號值的工具程序 - package com.ronsoft.books.nio.buffers;
- import java.nio.ByteBuffer;
- /**
- * 向 ByteBuffer 對象中獲取和存放無符號值的工具類。
- * 這里所有的函數(shù)都是靜態(tài)的,并且?guī)в幸粋€ ByteBuffer 參數(shù)。
- * 由于 java 不提供無符號原始類型,每個從緩沖區(qū)中讀出的無符號值被升到比它大的
- * 下一個基本數(shù)據(jù)類型中。
- * getUnsignedByte()返回一個 short 類型, getUnsignedShort()
- * 返回一個 int 類型,而 getUnsignedInt()返回一個 long 型。 There is no
- * 由于沒有基本類型來存儲返回的數(shù)據(jù),因此沒有 getUnsignedLong()。
- * 如果需要,返回 BigInteger 的函數(shù)可以執(zhí)行。
- * 同樣,存放函數(shù)要取一個大于它們所分配的類型的值。
- * putUnsignedByte 取一個 short 型參數(shù),等等。
- *
- * @author Ron Hitchens (ron@ronsoft.com)
- */
- public class Unsigned{
- public static short getUnsignedByte (ByteBuffer bb){
- return ((short)(bb.get( ) & 0xff));
- }
- public static void putUnsignedByte (ByteBuffer bb, int value){
- bb.put ((byte)(value & 0xff));
- }
- public static short getUnsignedByte (ByteBuffer bb, int position){
- return ((short)(bb.get (position) & (short)0xff));
- }
- public static void putUnsignedByte (ByteBuffer bb, int position, int value){
- bb.put (position, (byte)(value & 0xff));
- }
- public static int getUnsignedShort (ByteBuffer bb){
- return (bb.getShort( ) & 0xffff);
- }
- public static void putUnsignedShort (ByteBuffer bb, int value){
- bb.putShort ((short)(value & 0xffff));
- }
- public static int getUnsignedShort (ByteBuffer bb, int position){
- return (bb.getShort (position) & 0xffff);
- }
- public static void putUnsignedShort(ByteBuffer bb, int position, int value){
- bb.putShort (position, (short)(value & 0xffff));
- }
- public static long getUnsignedInt (ByteBuffer bb){
- return ((long)bb.getInt( ) & 0xffffffffL);
- }
- public static void putUnsignedInt (ByteBuffer bb, long value){
- bb.putInt ((int)(value & 0xffffffffL));
- }
- public static long getUnsignedInt (ByteBuffer bb, int position){
- return ((long)bb.getInt (position) & 0xffffffffL);
- }
- public static void putUnsignedInt (ByteBuffer bb, int position, long value){
- bb.putInt (position, (int)(value & 0xffffffffL));
- }
- }
2.4.6 內(nèi)存映射緩沖區(qū) 映射緩沖區(qū)是帶有存儲在文件,通過內(nèi)存映射來存取數(shù)據(jù)元素的字節(jié)緩沖區(qū)。映射緩沖區(qū)通常是直接存取內(nèi)存的,只能通過FileChannel類創(chuàng)建。映射緩沖區(qū)的用法和直接緩沖區(qū)類似,但是 MappedByteBuffer 對象可以處理獨立于文件存取形式的的許多特定字符。出于這個原因,我將討論映射緩沖區(qū)的內(nèi)容留到 3.4 節(jié),在那里我們也會討論文件鎖。 Java nio入門教程詳解(十二)
0
0
我們認(rèn)為:用戶的主要目的,是為了獲取有用的信息,而不是來點擊廣告的。因此本站將竭力做好內(nèi)容,并將廣告和內(nèi)容進(jìn)行分離,確保所有廣告不會影響到用戶的正常閱讀體驗。用戶僅憑個人意愿和興趣愛好點擊廣告。
我們堅信:只有給用戶帶來價值,用戶才會給我們以回報。
|