package voldemort.utils; import java.io.File; import java.util.Arrays; import java.util.Stack; import voldemort.annotations.concurrency.NotThreadsafe; import com.google.common.collect.AbstractIterator; /** * An iterator over all the files contained in a set of directories, including * any subdirectories * * */ @NotThreadsafe public class DirectoryIterator extends AbstractIterator<File> implements ClosableIterator<File> { private final Stack<File> stack; public DirectoryIterator(String... basis) { this.stack = new Stack<File>(); for(String f: basis) stack.add(new File(f)); } public DirectoryIterator(File... basis) { this.stack = new Stack<File>(); stack.addAll(Arrays.asList(basis)); } @Override protected File computeNext() { while(stack.size() > 0) { File f = stack.pop(); if(f.isDirectory()) { for(File sub: f.listFiles()) stack.push(sub); } else { return f; } } return endOfData(); } public void close() {} /** * Command line method to walk the directories provided on the command line * and print out their contents * * @param args Directory names */ public static void main(String[] args) { DirectoryIterator iter = new DirectoryIterator(args); while(iter.hasNext()) System.out.println(iter.next().getAbsolutePath()); } }