小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java nio入門教程詳解(七)

 360lec 2016-09-30

2.4 字節(jié)緩沖區(qū)

在本章節(jié)中,我們將進(jìn)一步觀察字節(jié)緩沖區(qū)。所有的基本數(shù)據(jù)類型都有相應(yīng)的緩沖區(qū)類(布爾型除外),但字節(jié)緩沖區(qū)有自己的獨(dú)特之處。字節(jié)是操作系統(tǒng)及其 I/O 設(shè)備使用的基本數(shù)據(jù)類型。當(dāng)在 JVM 和操作系統(tǒng)間傳遞數(shù)據(jù)時(shí),將其他的數(shù)據(jù)類型拆分成構(gòu)成它們的字節(jié)是十分必要的。如我們?cè)诤竺娴恼鹿?jié)中將要看到的那樣,系統(tǒng)層次的 I/O 面向字節(jié)的性質(zhì)可以在整個(gè)緩沖區(qū)的設(shè)計(jì)以及它們互相配合的服務(wù)中感受到。

為了提供參考,以下是ByteBuffer的完整 API。這些函數(shù)有些已經(jīng)在前面的章節(jié)中討論,并且僅僅是針對(duì)具體類型的版本。新的函數(shù)將在本節(jié)以及后面的章節(jié)中涉及。

  1. package java.nio;
  2. public abstract class ByteBuffer extends Buffer implements Comparable
  3. {
  4. public static ByteBuffer allocate (int capacity)
  5. public static ByteBuffer allocateDirect (int capacity)
  6. public abstract boolean isDirect();
  7. public static ByteBuffer wrap (byte[] array, int offset, int length)
  8. public static ByteBuffer wrap (byte[] array)
  9. public abstract ByteBuffer duplicate();
  10. public abstract ByteBuffer asReadOnlyBuffer();
  11. public abstract ByteBuffer slice();
  12. public final boolean hasArray()
  13. public final byte [] array()
  14. public final int arrayOffset()
  15. public abstract byte get();
  16. public abstract byte get (int index);
  17. public ByteBuffer get (byte[] dst, int offset, int length)
  18. public ByteBuffer get (byte[] dst, int offset, int length)
  19. public abstract ByteBuffer put (byte b);
  20. public abstract ByteBuffer put (int index, byte b);
  21. public ByteBuffer put (ByteBuffer src)
  22. public ByteBuffer put (byte[] src, int offset, int length)
  23. public final ByteBuffer put (byte[] src)
  24. public final ByteOrder order()
  25. public final ByteBuffer order (ByteOrder bo)
  26. public abstract CharBuffer asCharBuffer();
  27. public abstract ShortBuffer asShortBuffer();
  28. public abstract IntBuffer asIntBuffer();
  29. public abstract LongBuffer asLongBuffer();
  30. public abstract FloatBuffer asFloatBuffer();
  31. public abstract DoubleBuffer asDoubleBuffer();
  32. public abstract char getChar();
  33. public abstract char getChar(int index);
  34. public abstract ByteBuffer putChar (char value);
  35. public abstract ByteBuffer putChar (int index, char value);
  36. public abstract short getShort();
  37. public abstract short getShort (int index);
  38. public abstract ByteBuffer putShort (short value);
  39. public abstract ByteBuffer putShort (int index, short value);
  40. public abstract int getInt();
  41. public abstract int getInt (int index);
  42. public abstract ByteBuffer putInt (int value);
  43. public abstract ByteBuffer putInt (int index, int value);
  44. public abstract long getLong();
  45. public abstract long getLong (int index);
  46. public abstract ByteBuffer putLong (long value);
  47. public abstract ByteBuffer putLong (int index, long value);
  48. public abstract float getFloat();
  49. public abstract float getFloat (int index);
  50. public abstract ByteBuffer putFloat (float value);
  51. public abstract ByteBuffer putFloat (int index, float value);
  52. public abstract double getDouble();
  53. public abstract double getDouble (int index);
  54. public abstract ByteBuffer putDouble (double value);
  55. public abstract ByteBuffer putDouble (int index, double value);
  56. public abstract ByteBuffer compact();
  57. public boolean equals (Object ob)
  58. public int compareTo (Object ob)
  59. public String toString()
  60. public int hashCode()
  61. }
字節(jié)總是八位的,對(duì)嗎?
目前,字節(jié)幾乎被廣泛認(rèn)為是八個(gè)比特位。但這并非一直是實(shí)情。在過(guò)去的時(shí)代,每個(gè)字節(jié)可以是3到12之間任何個(gè)數(shù)或者更多個(gè)的比特位,最常見(jiàn)的是6到9位。八位的字節(jié)來(lái)自于市場(chǎng)力量和實(shí)踐的結(jié)合。它之所以實(shí)用是因?yàn)?位足以表達(dá)可用的字符集(至少是英文字符),8是2 的三次乘方(這簡(jiǎn)化了硬件設(shè)計(jì)),八恰好容納兩個(gè)十六進(jìn)制數(shù)字,而且8的倍數(shù)提供了足夠的組合位來(lái)存儲(chǔ)有效的數(shù)值。最初的市場(chǎng)推廣力量是IBM。在 1960 年首先推出的 IBM360 大型機(jī)使用的就是8位字節(jié)。

2.4.1 字節(jié)順序

非字節(jié)類型的基本類型,除了布爾型都是由組合在一起的幾個(gè)字節(jié)組成的。這些數(shù)據(jù)類型及其大小總結(jié)在表 2-1 中。

表 2-1.基本數(shù)據(jù)類型及其大小數(shù)據(jù)類型大小(以字節(jié)表示)
數(shù)據(jù)類型大小(以字節(jié)表示)
Byte1
Char2
Short2
Int4
Long8
Float4
Double8

每個(gè)基本數(shù)據(jù)類型都是以連續(xù)字節(jié)序列的形式存儲(chǔ)在內(nèi)存中。例如,32位的int值0x037fb4c7(十進(jìn)制的58,700,999)可能會(huì)如圖 2-14 所顯示的那樣被塞入內(nèi)存字節(jié)中(內(nèi)存地址從左往右增加)。注意前一個(gè)句子中的「可能」一詞。盡管字節(jié)大小已經(jīng)被確定,但字節(jié)順序問(wèn)題一直沒(méi)有被廣泛認(rèn)同。表示一個(gè)整型值的字節(jié)可能在內(nèi)存中僅僅如圖 2-15 所示的那樣被簡(jiǎn)單地排列。

圖 2.14 大端字節(jié)順序圖 2.14 大端字節(jié)順序

布爾型代表兩種值:truefalse。一個(gè)字節(jié)可以包含256個(gè)唯一值,所以一個(gè)布爾值不能準(zhǔn)確地對(duì)應(yīng)到一個(gè)或多個(gè)字節(jié)上。字節(jié)是所有緩沖區(qū)的構(gòu)造塊。NIO 架構(gòu)決定了布爾緩沖區(qū)的執(zhí)行是有疑問(wèn)的,而且對(duì)這種緩沖區(qū)類型的需求不管怎么說(shuō)都是頗具爭(zhēng)議的。

圖 2.15 小端字節(jié)順序圖 2.15 小端字節(jié)順序

多字節(jié)數(shù)值被存儲(chǔ)在內(nèi)存中的方式一般被稱為endian-ness(字節(jié)順序)。如果數(shù)字?jǐn)?shù)值的最高字節(jié)——big end(大端),位于低位地址,那么系統(tǒng)就是大端字節(jié)順序(如圖 2-14 所示)。如果最低字節(jié)最先保存在內(nèi)存中,那么小端字節(jié)順序(如圖 2-15 所示)。

字節(jié)順序很少由軟件設(shè)計(jì)者決定;它通常取決于硬件設(shè)計(jì)。字節(jié)順序的兩種類型有時(shí)被稱為字節(jié)性別,在當(dāng)今被廣泛使用。兩種方式都具有自身的優(yōu)勢(shì)。Intel 處理器使用小端字節(jié)順序涉及。摩托羅拉的CPU系列、SUN的Sparc工作站,以及PowerPC的CPU架構(gòu)都采用大端字節(jié)順序。

字節(jié)順序的問(wèn)題甚至勝過(guò)CPU硬件設(shè)計(jì)。當(dāng)Internet的設(shè)計(jì)者為互聯(lián)各種類型的計(jì)算機(jī)而設(shè)計(jì)網(wǎng)際協(xié)議(IP)時(shí),他們意識(shí)到了在具有不同內(nèi)部字節(jié)順序的系統(tǒng)間傳遞數(shù)值數(shù)據(jù)的問(wèn)題。因此,IP協(xié)議規(guī)定了使用大端的網(wǎng)絡(luò)字節(jié)順序概念。所有在IP分組報(bào)文的協(xié)議部分中使用的多字節(jié)數(shù)值必須先在本地主機(jī)字節(jié)順序和通用的網(wǎng)絡(luò)字節(jié)順序之間進(jìn)行轉(zhuǎn)換。

在java.nio中,字節(jié)順序由ByteOrder類封裝。

  1. package java.nio;
  2. public final class ByteOrder
  3. {
  4. public static final ByteOrder BIG_ENDIAN
  5. public static final ByteOrder LITTLE_ENDIAN
  6. public static ByteOrder nativeOrder( )
  7. public String toString( )
  8. }

ByteOrder類定義了決定從緩沖區(qū)中存儲(chǔ)或檢索多字節(jié)數(shù)值時(shí)使用哪一字節(jié)順序的常量。這個(gè)類的作用就像一個(gè)類型安全的枚舉。它定義了以其本身實(shí)例預(yù)初始化的兩個(gè)public區(qū)域。只有這兩個(gè)ByteOrder實(shí)例總是存在于 JVM 中,因此它們可以通過(guò)使用--操作符進(jìn)行比較。如果您需要知道JVM運(yùn)行的硬件平臺(tái)的固有字節(jié)順序,請(qǐng)調(diào)用靜態(tài)類函數(shù)nativeOrder()。它將返回兩個(gè)已確定常量中的一個(gè)。調(diào)用toString()將返回一個(gè)包含兩個(gè)文字字符串BIG_ENDIAN或者LITTLE_ENDIAN之一的String。

每個(gè)緩沖區(qū)類都具有一個(gè)能夠通過(guò)調(diào)用order()查詢的當(dāng)前字節(jié)順序設(shè)定。

  1. public abstract class CharBuffer extends Buffer implements Comparable, CharSequence
  2. {
  3. // 這里僅列出部分API
  4. public final ByteOrder order()
  5. }

因特網(wǎng)技術(shù)將字節(jié)成為八位位組(octet)。如側(cè)欄所介紹的,一個(gè)字節(jié)的大小是有歧義的。通過(guò)使用「octet」這一術(shù)語(yǔ),IP規(guī)則明確表明字節(jié)由八個(gè)位組成。

這個(gè)函數(shù)從ByteOrder返回兩個(gè)常量之一。對(duì)于除了ByteOrder之外的其他緩沖區(qū)類,字節(jié)順序是一個(gè)只讀屬性,并且可能根據(jù)緩沖區(qū)的建立方式而采用不同的值。除了ByteBuffer,其他通過(guò)分配或包裝一個(gè)數(shù)組所創(chuàng)建的緩沖區(qū)將從order()返回與ByteOrder.nativeOrder()相同的數(shù)值。這使因?yàn)榘诰彌_區(qū)中的元素在JVM中將會(huì)被作為基本數(shù)據(jù)直接存取。

ByteBuffer類有所不同:默認(rèn)字節(jié)順序總是ByteBuffer.BIG_ENDIAN,無(wú)論系統(tǒng)的固有字節(jié)順序是什么。Java的默認(rèn)字節(jié)順序是大端字節(jié)順序,這允許類文件等以及串行化的對(duì)象可以在任何JVM中工作。如果固有硬件字節(jié)順序是小端,這會(huì)有性能隱患。在使用固有硬件字節(jié)順序時(shí),將ByteBuffer的內(nèi)容當(dāng)作其他數(shù)據(jù)類型存取(很快就會(huì)討論到)很可能高效得多。 很可能您會(huì)對(duì)為什么ByteBuffer類需要一個(gè)字節(jié)順序設(shè)定這一問(wèn)題感到困惑。字節(jié)就是字節(jié),對(duì)嗎?當(dāng)然,但是如您不久將在 2.4.4 節(jié)所看到的那樣,ByteBuffer對(duì)象像其他基本數(shù)據(jù)類型一樣,具有大量便利的函數(shù)用于獲取和存放緩沖區(qū)內(nèi)容。這些函數(shù)對(duì)字節(jié)進(jìn)行編碼或解碼的方式取決于 ByteBuffer當(dāng)前字節(jié)順序的設(shè)定。ByteBuffer的字符順序設(shè)定可以隨時(shí)通過(guò)調(diào)用以ByteOrder.BIG_ENDIANByteOrder.LITTL_ENDIAN為參數(shù)的order()函數(shù)來(lái)改變。

  1. public abstract class ByteBuffer extends Buffer implements Comparable
  2. {
  3. // 這里僅列出部分API
  4. public final ByteOrder order()
  5. public final ByteBuffer order (ByteOrder bo)
  6. }

如果一個(gè)緩沖區(qū)被創(chuàng)建為一個(gè)ByteBuffer對(duì)象的視圖(參見(jiàn) 2.4.3 節(jié)),那么order()返回的數(shù)值就是視圖被創(chuàng)建時(shí)其創(chuàng)建源頭的 ByteBuffer的字節(jié)順序設(shè)定。視圖的字節(jié)順序設(shè)定在創(chuàng)建后不能被改變,而且如果原始的字節(jié)緩沖區(qū)的字節(jié)順序在之后被改變,它也不會(huì)受到影響。

Java nio入門教程詳解(八)

0 0
我們認(rèn)為:用戶的主要目的,是為了獲取有用的信息,而不是來(lái)點(diǎn)擊廣告的。因此本站將竭力做好內(nèi)容,并將廣告和內(nèi)容進(jìn)行分離,確保所有廣告不會(huì)影響到用戶的正常閱讀體驗(yàn)。用戶僅憑個(gè)人意愿和興趣愛(ài)好點(diǎn)擊廣告。
我們堅(jiān)信:只有給用戶帶來(lái)價(jià)值,用戶才會(huì)給我們以回報(bào)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多