csusky

          常用鏈接

          統計

          最新評論

          org.apache.lucene.store.OutputStream

          OutputStream
          這是一個Abstract類,是Lucene自己的一個文件輸出流的基類
          BUFFER_SIZE = 1024  緩沖區 大小為 1024bit
          bufferStart = 0 文件位置指針
          bufferPosition = 0 內存緩沖區指針

           public final void writeByte(byte b) throws IOException {
              if (bufferPosition >= BUFFER_SIZE)
                flush();
              buffer[bufferPosition++] = b;
            }
          幾乎所有的寫入函數都要調用這個函數,如果緩沖區的當前容量已經等于他的最大容量,則將緩沖區中的數據寫入文件。

          public final void writeBytes(byte[] b, int length) throws IOException
          批量寫byte進入內存緩沖

          public final void writeInt(int i) throws IOException
          寫入整形數據

          public final void writeLong(long i) throws IOException
          寫入長整型數據,即結合移位運算調用兩次writeInt(int i)

          另外,最值得注意的是在該類中有兩個最特殊的函數
          writeVInt(int i) /   writeVLong(long i),
          先說
          writeVInt(int  i )   {
           while ((i & ~0x7F) != 0) {                               
                writeByte((byte)((i & 0x7f) | 0x80));
                i >>>= 7;
              }
              writeByte((byte)i);
          }
          ~0x7F==~(0111 1111)==(1000 0000)==0x80
          ((i & ~0x7F) != 0) 這一句判斷i是否大于0x80,如果不是則說明該int只有一個字節的有效數據,其他字節都是0,直接轉化為Byte寫入。
          如果大于0x80則
          (i & 0x7f) | 0x80
          i&0x7f 只對后7位進行處理,|0x80將第8位置1,與前面的7個bit構成一個字節,置1的原因是說明該字節并不是一個完整的整形數,需要與其他的字節合起來才能構成一個整形數字。
          這個算法相當于將一個32bit的整形數字按照每7位編碼成一個字節進行存儲,將按照整形數的大小存儲1-5個字節。

          writeVLong(long i)方法大致與其相同。

          final void writeChars(String s, int start, int length)
          將字符串轉化成UTF-8編碼的格式進行存儲。
          附:

          UNICODE值 UTF-8編碼
          U-00000000 - U-0000007F: 0xxxxxxx
          U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
          U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

          可見對于在 0x00-0x7F范圍內的UNICODE值(最大有效數位:7位),將會編碼成單字節的,會大大節約存儲空間。
          對于在           0x80-0x7FF范圍內的UNICODE(最大有效數位:11位),會編碼成雙字節的。先存儲原字節低5位的數位,且將最高位和次高位都置1,再次高位置0(writeByte((byte)(0xC0 | (code >> 6)));)。然后存儲后6位的字節,將前兩位置10(writeByte((byte)(0x80 | (code & 0x3F)));)
          對于其他的UNICODE值則
          writeByte((byte)(0xE0 | (code >>> 12)));               4位
           writeByte((byte)(0x80 | ((code >> 6) & 0x3F)));   5位
           writeByte((byte)(0x80 | (code & 0x3F)));            3- 5位

          final void writeString(String s) throws IOException
          該函數首先用s.length()判斷該String總共有多少個字符
          然后首先調用writeVInt寫入這個字符長度
          再調用writeChars(s,s.length())寫入字符


          在inputStream中的readString()方法則與其相反,首先用readVInt()方法讀取字符長度len 然后讀取len長度的字符

          protected final void flush() throws IOException
          該方法調用另外一個方法flushBuffer將緩沖區中的數據輸出,然后清空緩沖區;

          abstract void flushBuffer(byte[] b, int len) throws IOException
          可見flushBuffer方法是abstract的,即需要其子類對該方法進行覆寫,以定位該輸出流的輸出方式。

          final long getFilePointer() throws IOException
          得到文件指針的位置,即得到輸出流已經輸出的字節數。

          public void seek(long pos) throws IOException
          輸出緩沖區的內容,然后將文件指針定位到long所指示的文件位置。

          abstract long length() throws IOException
          返回文件中已有的字節數。需要子類實現。

















          posted on 2008-04-16 21:24 曉宇 閱讀(220) 評論(0)  編輯  收藏 所屬分類: LUCENE

          主站蜘蛛池模板: 崇礼县| 锦州市| 尼木县| 昔阳县| 马龙县| 沧州市| 南丰县| 武陟县| 长兴县| 临安市| 章丘市| 灵武市| 安西县| 沂水县| 汾阳市| 永平县| 南城县| 偃师市| 玉龙| 靖西县| 蛟河市| 赤壁市| 基隆市| 伊春市| 金堂县| 板桥市| 太仆寺旗| 屏山县| 且末县| 台北市| 邢台县| 新巴尔虎右旗| 长武县| 工布江达县| 什邡市| 牟定县| 达州市| 大田县| 鹿泉市| 元朗区| 遂平县|