葉明的javablog

          java學(xué)習(xí)天堂,個人關(guān)于其他blog:blog.javaworker.cn,歡迎大家訪問
          posts - 64, comments - 50, trackbacks - 0, articles - 3

          首先我們看構(gòu)造函數(shù)中的第一個類Directory 類。根據(jù)這個類的英文,我們能得出這個類就是關(guān)于目錄操作的。Directory 是一個抽象類。其有4個子類,分別是:DbDirectory, FSDirectory, JEDirectory, RAMDirectory

          首先我們看看Directory 的類
          public abstract class Directory {
          volatile boolean isOpen = true;
          /*** 持有一個LockFactory的實例(實現(xiàn)鎖定這個目錄實例)*/
          protected LockFactory lockFactory;
          /**返回該目錄下的所有文件數(shù)組.如果這個目錄下沒有文件存在,或者存在權(quán)限問題不能訪問,該方法可能返回Null*/
          public abstract String[] list() throws IOException;
          /** * 返回指定名稱的文件是不是存在 */
          public abstract boolean fileExists(String name)
          throws IOException;
          /**返回指定名稱的文件最后修改的時間
          public abstract long fileModified(String name) throws IOException;
          /**設(shè)置指定文件名的文件最后的修改時間為當(dāng)前時間*/
          public abstract void touchFile(String name) throws IOException;

          /**刪除指定文件。 */
          public abstract void deleteFile(String name)throws IOException;
          /**返回指定文件的長度。 */
          public abstract long fileLength(String name) throws IOException;
          /** 在當(dāng)前目錄下使用給定的名稱創(chuàng)建一個空的文件。并且返回一個流來寫該文件。*/
          public abstract IndexOutput createOutput(String name) throws IOException;
          /** * Lucene使用該方法確保所有的針對該文件的寫操作都會存儲到Index。并且阻止machine/OS發(fā)生故障 破壞該index。*/
          public void sync(String name) throws IOException {}
          /**獲取已經(jīng)存在的一個文件的IndexInput流操作該文件。 */
          public abstract IndexInput openInput(String name) throws IOException;
          /** 返回已經(jīng)存在的一個文件、并且使用指定大小的緩沖的IndexInput,但是當(dāng)前目錄也可能忽略該緩沖池的大小,
          * 當(dāng)前主要是考慮CompoundFileReader和FSDirectory對于次參數(shù)的需求。*/
          public IndexInput openInput(String name, int bufferSize) throws IOException {
          return openInput(name);
          }
          /** 創(chuàng)建一個指定名稱的鎖/
          public Lock makeLock(String name) {
          return lockFactory.makeLock(name);
          }
          /**
          * 清除指定的鎖定(強行解鎖和刪除)這不僅要求在這個時候當(dāng)前的鎖一定不在使用。 */
          public void clearLock(String name) throws IOException {
          if (lockFactory != null) {
          lockFactory.clearLock(name);
          }
          }
          /** 結(jié)束這個store. */
          public abstract void close() throws IOException;

          /**設(shè)置LockFactory,此目錄實例應(yīng)使其鎖定執(zhí)行。每個LockFactory實例只用于一個目錄(即,不要共用一個實例在多個目錄) */
          public void setLockFactory(LockFactory lockFactory) {
          this.lockFactory = lockFactory;
          lockFactory.setLockPrefix(this.getLockID());
          }

          /** 獲得LockFactory,此目錄例實例使用其鎖定執(zhí)行。請注意,這可能是無效的目錄執(zhí)行,提供自己鎖執(zhí)行*/
          public LockFactory getLockFactory() {
          return this.lockFactory;
          }
          /**過去鎖實例的唯一表示ID的字符串描述*/
          public String getLockID() {
          return this.toString();
          }
          /**// 拷貝源目錄src下的文件,復(fù)制到目的目錄dest下面,拷貝完成后關(guān)閉源目錄src*/
          public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException {
          final String[] files = src.list();
          if (files == null)
          throw new IOException("cannot read directory " + src + ": list() returned null");
          byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
          for (int i = 0; i < files.length; i++) {
          IndexOutput os = null;
          IndexInput is = null;
          try {
          // create file in dest directory
          os = dest.createOutput(files[i]);
          // read current file
          is = src.openInput(files[i]);
          // and copy to dest directory
          long len = is.length();
          long readCount = 0;
          while (readCount < len) {
          int toRead = readCount + BufferedIndexOutput.BUFFER_SIZE > len ? (int)(len - readCount) : BufferedIndexOutput.BUFFER_SIZE;
          is.readBytes(buf, 0, toRead);
          os.writeBytes(buf, toRead);
          readCount += toRead;
          }
          } finally {
          // graceful cleanup
          try {
          if (os != null)
          os.close();
          } finally {
          if (is != null)
          is.close();
          }
          }
          }
          if(closeDirSrc)
          src.close();
          }

          從Directory抽象類的定義,我們可以得到如下幾點:
          1、管理鎖工廠及其鎖實例;
          2、管理Directory目錄實例的基本屬性,主要是通過文件名稱進(jìn)行管理;
          3、管理與操作該目錄相關(guān)的一些流對象;
          4、管理索引文件的拷貝。

          主站蜘蛛池模板: 富民县| 金门县| 绥德县| 潞西市| 罗定市| 淮南市| 贵州省| 乌拉特中旗| 曲阜市| 长寿区| 基隆市| 巧家县| 新龙县| 长泰县| 武强县| 宜君县| 永丰县| 延吉市| 镇坪县| 遂川县| 乃东县| 介休市| 大悟县| 裕民县| 大余县| 江门市| 富宁县| 新宾| 中宁县| 涞源县| 祁阳县| 凤凰县| 青龙| 工布江达县| 高邑县| 南涧| 玉树县| 泸州市| 霍山县| 镇安县| 江永县|