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]