<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    csusky

    常用鏈接

    統計

    最新評論

    org.apache.lucene.store.FSDirectory

    FSDirectory繼承了abstract類Directory
    在該類中既有該類的一些初始化操作,又有對FSDirectory對象本身的一些操作,這是為什么把其構造函數設置為私有的一部分原因

    static final Hashtable DIRECTORIES = new Hashtable();
    每新建一個FSDirectory都會將其加入到該Hashtable中來。名稱是FSDirectory對應的File   值是該FSDirectory。
    注意:final對象并非是不可更改的

    static final String LOCK_DIR =
        System.getProperty("org.apache.lucene.lockdir",
          System.getProperty("java.io.tmpdir"));
    首先看用戶是否注冊了"org.apache.lucene.lockdir"屬性,如果沒有則用JAVA虛擬機固有的"java.io.tmpdir"屬性
    這個屬性是一個路徑,代表lucene的鎖文件鎖放的位置。

    static final boolean DISABLE_LOCKS =
          Boolean.getBoolean("disableLuceneLocks") || Constants.JAVA_1_1;
    如果用戶注冊了"disableLuceneLocks"屬性且為false,或者JAVA的版本是1.1則無法使用鎖。

    static FSDirectory getDirectory(String path, boolean create)
    static FSDirectory getDirectory(File file, boolean create)
    從得到一個指定路徑或者文件的FSDirectory如果在則取出,如果不存在則用其私有的構造函數構造一個
    該類還有3個非static的類變量
      private File directory = null;      索引目錄
      private int refCount;                   鎖目錄
      private File lockDir;                    索引目錄數目
    實際上,初始化一個FSDirectory只需要初始化這3個變量即可
    如果create的值為true 則:如果索引目錄是已經存在的目錄,則會遍歷該目錄然后刪除每一個文件,如果鎖目錄是已存在的也會用list返回所有的文件然后調用file.delete() 刪除。 如果目錄不存在則創建一個新的。

    注意:list()方法   會先用文件名進行排序然后返回(a.txt會比b.txt先返回)    且delete方法刪除文件夾時,只能刪除空文件夾。如果失敗則跳出程序,不會刪除在該文件夾之后返回的文件。(如果有aa.txt , ab/b.txt , b.txt , 則刪除時候由于a文件夾非空刪除失敗,則b.txt由于前面刪除失敗跳出程序,也不會被刪除,但是aa.txt被正常刪除)

    private FSDirectory(File path, boolean create) throws IOException
    私有的構造函數

    private synchronized void create() throws IOException
    創建新的directory /lockDir目錄,當目錄已存在時即清空該目錄,不存在即創建新的目錄。

    final String[] list() throws IOException
    以字符串文件名的形式返回索引目錄的所有文件

    final boolean fileExists(String name) throws IOException
    在索引目錄是否存在指定文件名的文件

    final long fileModified(String name) throws IOException
    static final long fileModified(File directory, String name)
    返回該文件的最后修改時間,directory參數為相對路徑,第一個函數的相對路徑為索引目錄

    void touchFile(String name) throws IOException
    將該文件的最后修改時間設置為當前時間

    final long fileLength(String name) throws IOException
    返回該文件的長度

    final void deleteFile(String name) throws IOException
    刪除該文件

    final synchronized void renameFile(String from, String to) throws IOException
    重命名該文件
    該方法會首先檢測新的文件名命名的文件是否已經存在如果存在即刪除該文件,然后再將文件重新命名為新的文件名。
    doug cutting在該方法的注釋上寫到:
    1.刪除操作和重命名的操作不是原子的。
    2.重命名操作在有些虛擬機上面不能正確的工作,如果重命名失敗則會采用手動copy的方法。使用輸入輸出流將舊的文件的內容寫入到新的文件中去,然后刪除舊的文件。
    注意:該方法必須是同步的。

    final OutputStream createFile(String name) throws IOException
    用指定的文件名創建一個新的可寫的空文件  實際上返回的是FSOutputStream,注意這里的OutputStream并不是java的基礎類。而是doug cutting自己寫的一個文件隨即訪問類。同理FSInputStream和InputStream也是Lucene自己的類。

    final InputStream openFile(String name) throws IOException
    從一個存在的文件打開一個輸入流

    getLockPrefix()
    在FSDirectory中還有
     private static MessageDigest DIGESTER;這個靜態變量是提供加密功能的
    DIGESTER=MessageDigest.getInstance("MD5"),-----MD5加密算法
    或者可以DIGESTER=MessageDigest.getInstance("SHA"),-----SHA加密算法
    用于對鎖目錄的   文件名的加密
    用法如下:
    digest = DIGESTER.digest(dirName.getBytes());  dirName是需要被加密的字符串,這里是索引文件的目錄名,
    在FSContext中,其應用在 getLockPrefix() 該方法是為某個索引目錄創建其對應的鎖目錄文件名。
    首先返回經過加密后的byte[] 數組digest,然后將digest按照每4個bit轉化為一個16進制的字符,存進一個StringBuffer中
    其轉化類似與Base64編碼方式,不過要簡單得多。

    方法
    Lockl  makeLock(String name)
    是從Directory中擴展而來的,該方法返回一個Lock對象,該對象將會在介紹完Lucene的輸入輸出流之后介紹。
    該方法比較簡單,首先是調用了getLockPrefix() 方法,返回文件鎖的部分對象名,然后在該名稱后面加上鎖的特征名
    譬如說讀寫鎖 事務鎖
    其名稱類似于下:
    lucene-12c90c2c381bc7acbc4846b4ce97593b-write.lock
    lucene-12c90c2c381bc7acbc4846b4ce97593b-commit.lock
    這兩種鎖機制將會在后面介紹
    最后通過一個匿名的內部類返回一個經過重載的Lock對象,該內部類中的方法有鎖的創建,得到,釋放,以及檢測,另外還有一個toString()方法返回鎖的名稱。



    在FSDirectory類中有OutputStream和InputStream的實現類,這兩個虛類只是定義了一些操作,并沒有定義輸入或者輸出的設備。
    Lucene在輸入輸出的設計上,將會由子類定義輸入輸出的設備。
    FSOutputStream
    在FSOutputStream中有一個 RandomAccess File=new RandomAccessFile(path, "rw");
    在對該輸出流的操作將用調用該file的相應方法實現
    最重要的
      public final void flushBuffer(byte[] b, int size) throws IOException {
        file.write(b, 0, size);
      }
    flushBuffer的調用將會將byte中的0--size范圍的數據寫入到文件path中去。


    FSInputStream
    最重要的
    protected final void readInternal(byte[] b, int offset, int len)
           throws IOException {
        synchronized (file) {
          long position = getFilePointer();     //得到該當前文件指針
          if (position != file.position) {
            file.seek(position);
            file.position = position;
          }
          int total = 0;
          do {

       //從文件中讀取指定長度的字節到字節數組
       // 在其基類InputStream中的refill()方法  將會調用  readInternal(buffer, 0, bufferLength);首先從文件中讀取字節到緩沖數組。
      //  在InputStream中每次讀取操作都會調用readInternal方法,或者通過refill()方法間接調用該方法。
            int i = file.read(b, offset+total, len-total);       //將文件中的數據讀到緩沖區
            if (i == -1)
              throw new IOException("read past EOF");
            file.position += i;
            total += i;
          } while (total < len);
        }
      }





















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

    主站蜘蛛池模板: 成年女人视频网站免费m| 午夜免费啪视频在线观看 | 亚洲乱码在线卡一卡二卡新区| 男人的天堂网免费网站| 亚洲av无码成h人动漫无遮挡| 三年片免费观看大全国语| 亚洲综合伊人久久大杳蕉| 久久久久久噜噜精品免费直播| 久久久久亚洲?V成人无码| 中文字幕在线视频免费| 国产亚洲人成网站在线观看不卡| 永久免费AV无码网站国产| 亚洲国产人成在线观看69网站| 99re视频精品全部免费| 亚洲成人网在线观看| 成人毛片免费播放| 视频一区在线免费观看| 亚洲色大成网站www永久一区| 久久成人免费大片| 33333在线亚洲| 免费人成视网站在线观看不卡 | 日韩精品无码免费专区午夜不卡| 亚洲av永久无码精品网站| 99久久免费中文字幕精品| 亚洲人成77777在线播放网站不卡| 午夜免费福利在线| 国产成人自产拍免费视频| 亚洲福利在线观看| 免费黄色一级毛片| 中国极品美軳免费观看| 亚洲午夜电影在线观看高清 | 国产精品jizz在线观看免费| 日韩精品视频在线观看免费 | 在线aⅴ亚洲中文字幕| 亚洲人成色77777在线观看大| 久久精品国产影库免费看| 久久乐国产综合亚洲精品| 在线亚洲人成电影网站色www| 久久精品免费一区二区| 免费大片黄在线观看| 亚洲成年人电影在线观看|