bmesser     2004/12/30 04:55:10

  Modified:    src/java/org/apache/lucene/index CompoundFileReader.java
  Log:
  add a public static void main method to list and optional extract the 
individual files from a compound. The original code was proposed by Garrett 
Rooney.
  
  Revision  Changes    Path
  1.15      +83 -1     
jakarta-lucene/src/java/org/apache/lucene/index/CompoundFileReader.java
  
  Index: CompoundFileReader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/CompoundFileReader.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- CompoundFileReader.java   28 Sep 2004 18:15:52 -0000      1.14
  +++ CompoundFileReader.java   30 Dec 2004 12:55:10 -0000      1.15
  @@ -17,12 +17,16 @@
    */
   
   import org.apache.lucene.store.Directory;
  +import org.apache.lucene.store.FSDirectory;
   import org.apache.lucene.store.IndexInput;
   import org.apache.lucene.store.BufferedIndexInput;
   import org.apache.lucene.store.IndexOutput;
   import org.apache.lucene.store.Lock;
  +
  +import java.util.Arrays;
   import java.util.HashMap;
   import java.io.IOException;
  +import java.io.FileOutputStream;
   
   
   /**
  @@ -233,5 +237,83 @@
           }
   
   
  +    }
  +
  +    /**
  +     * Prints the filename and size of each file within a given compound 
file.
  +     * Add the -extract flag to extract files to the current working 
directory.
  +     * In order to make the extracted version of the index work, you have to 
copy
  +     * the segments file from the compound index into the directory where 
the extracted files are stored.
  +     * @param args
  +     */
  +    public static void main(String [] args) {
  +      String dirname = null, filename = null;
  +      boolean extract = false;
  +
  +      for (int i = 0; i < args.length; ++i) {
  +        if (args[i].equals("-extract")) {
  +          extract = true;
  +        } else if (dirname == null) {
  +          dirname = args[i];
  +        } else if (filename == null) {
  +          filename = args[i];
  +        }
  +      }
  +
  +      if (dirname == null || filename == null) {
  +        System.out.println("Usage: CompoundFileReader [-extract] <directory> 
<cfsfile>");
  +        return;
  +      }
  +
  +      Directory dir = null;
  +      CompoundFileReader cfr = null;
  +        
  +      try {
  +        dir = FSDirectory.getDirectory(dirname, false);
  +
  +        cfr = new CompoundFileReader(dir, filename);
  +
  +        String [] files = cfr.list();
  +        Arrays.sort(files);   // sort the array of filename so that the 
output is more readable
  +        
  +        for (int i = 0; i < files.length; ++i) {
  +          long len = cfr.fileLength(files[i]);
  +
  +          if (extract) {
  +            System.out.println("extract " + files[i] + " with " + len + " 
bytes to local directory...");
  +            IndexInput ii = cfr.openInput(files[i]);
  +
  +            FileOutputStream f = new FileOutputStream(files[i]);
  +            
  +            // read and write with a small buffer, which is more effectiv 
than reading byte by byte
  +            byte[] buffer = new byte[1024];
  +            int chunk = buffer.length;
  +            while(len > 0) {
  +              final int bufLen = (int) Math.min(chunk, len);
  +              ii.readBytes(buffer, 0, bufLen);
  +              f.write(buffer, 0, bufLen);
  +              len -= bufLen;
  +            }
  +            
  +            f.close();
  +            ii.close();
  +          }
  +          else
  +            System.out.println(files[i] + ": " + len + " bytes");
  +        }
  +      } catch (IOException ioe) {
  +        ioe.printStackTrace();
  +      }
  +      finally {
  +        try {
  +          if (dir != null)
  +            dir.close();
  +          if (cfr != null)
  +            cfr.close();
  +        }
  +        catch (IOException ioe) {
  +          ioe.printStackTrace();
  +        }
  +      }
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to