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.

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@150723 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Bernhard Messer 2004-12-30 12:55:10 +00:00
parent cbe5047e62
commit fd754080ce
1 changed files with 82 additions and 0 deletions

View File

@ -17,12 +17,16 @@ package org.apache.lucene.index;
*/ */
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.BufferedIndexInput; import org.apache.lucene.store.BufferedIndexInput;
import org.apache.lucene.store.IndexOutput; import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.store.Lock; import org.apache.lucene.store.Lock;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.io.IOException; import java.io.IOException;
import java.io.FileOutputStream;
/** /**
@ -234,4 +238,82 @@ class CompoundFileReader extends Directory {
} }
/**
* 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();
}
}
}
} }