freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

[計算機]lucene代碼分析-資料下載頁

2025-08-17 04:26本頁面
  

【正文】 , isIndexed, (), storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms)。 (fi)。 (name, fi)。} (doc)的下一句:public void write(Directory d, String name) throws IOException { IndexOutput output = (name)。 try { write(output)。 } finally { ()。 }} 這個函數(shù)我們見過,但是因為Directory是RAMDirectory,所以并沒有以文件的形式產(chǎn)生。public void write(IndexOutput output) throws IOException { (size())。 for (int i = 0。 i size()。 i++) { FieldInfo fi = fieldInfo(i)。 byte bits = 0x0。 if () bits |= IS_INDEXED。 if () bits |= STORE_TERMVECTOR。 if () bits |= STORE_POSITIONS_WITH_TERMVECTOR。 if () bits |= STORE_OFFSET_WITH_TERMVECTOR。 if () bits |= OMIT_NORMS。 ()。 (bits)。 }} 我們這里可以看到,””中保存的是Field的名字以及設(shè)置。我們看一下,第一,寫入了有多少個Field,第二,分別寫入了Field的名字與設(shè)置。我把””中的內(nèi)容列出來看一下:01 08 54 68 65 46 69 65 6C 64 01 可能會有點奇怪,寫入的是size()是一個int,為什么就用了一個字節(jié)表示了呢?其實與我們上次看到的writeInt不同的是這里用的是writeVInt:public void writeInt(int i) throws IOException { writeByte((byte) (i 24))。 writeByte((byte) (i 16))。 writeByte((byte) (i 8))。 writeByte((byte) i)。}/** Writes an int in a variablelength format. Writes between one and * five bytes. Smaller values take fewer bytes. Negative numbers are not * supported.*/public void writeVInt(int i) throws IOException { while ((i amp。 ~0x7F) != 0) { writeByte((byte) ((i amp。 0x7f) | 0x80))。 i = 7。 } writeByte((byte) i)。} 可以看出writeInt很簡單,分成4個字節(jié)寫就可以了,而writeVInt看起來有點讓人不解,大概講一下,~0x7F是除低7位,其它位都為1,(i amp。 ~0x7F) != 0的意思就是高25位不為0(int是用32位表示,除去低7位就是25)。進到循環(huán)內(nèi)i amp。 0x7f表示取低7位,(i amp。 0x7f) | 0x80表示取低7位,并將最高位置1,然后右移7位,寫下7位。最后把余下的位寫入。概括一點講就是每次寫七位,如果不是最后一個字節(jié),那么最高位都有1這個標志位,如果是最后一個字節(jié),最高位為0。 我們接下來看寫入Field name的內(nèi)容,開頭是08我們可以猜出來,它應(yīng)該是TheField(我們起的Field的名字)的長度,后面的8個字符應(yīng)該就是”TheField”,我們還是看一下代碼:public void writeString(String s) throws IOException { int length = ()。 writeVInt(length)。 writeChars(s, 0, length)。}/** Writes a sequence of UTF8 encoded characters from a string.*/public void writeChars(String s, int start, int length) throws IOException { final int end = start + length。 for (int i = start。 i end。 i++) { final int code = (int) (i)。 if (code = 0x01 amp。amp。 code = 0x7F) writeByte((byte) code)。 else if (((code = 0x80) amp。amp。 (code = 0x7FF)) || code == 0) { writeByte((byte) (0xC0 | (code 6)))。 writeByte((byte) (0x80 | (code amp。 0x3F)))。 } else { writeByte((byte) (0xE0 | (code 12)))。 writeByte((byte) (0x80 | ((code 6) amp。 0x3F)))。 writeByte((byte) (0x80 | (code amp。 0x3F)))。 } }} 可以看到,我們的估計沒有錯,的確是先寫入它的長度,writeChars讓人更加糊涂,不過看懂了也就沒什么了。 For循環(huán)中第一個if不講了,1111 1111之間的字符,else if是在100 0000到111 1111 1111之間的字符,code 6右移6位,右移6位的原因是下面code amp。 0x3F是寫低6位。0xC0 | (code 6)是在高3位加上110的標志,而(0x80 | code amp。 0x3F)是在高兩位上加上01標志。最后else,右移12位(你還是知道一共有16個字節(jié)的吧?)那么就4位剩下了,(0xE0 | (code 12))加上1100標志位,下面兩個不講了,和上面的一樣。
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1