Here is one solution. It is best to use path/indentation/etc. to indicate directory structure, but everything will still be visited if you just print out file/directory names and call accept on each of a directory's children.
public interface FileSystemVisitor
{
public void visitFileNode(FileNode fn);
public void visitDirectoryNode(DirectoryNode dn);
}
import java.util.LinkedList;
public class PrintVisitor implements FileSystemVisitor
{
public LinkedList<String> directories = new LinkedList<String>();
public void visitFileNode(FileNode fn)
{
//print out the path
for(String dir: directories)
{
System.out.print(dir+"/");
}
System.out.println(fn.getName());
}
public void visitDirectoryNode(DirectoryNode dn)
{
//print out the path
for(String dir: directories)
{
System.out.print(dir+"/");
}
System.out.println(dn.getName());
//add this directory to the path
directories.add(dn.getName());
for(FileSystemNode fsn: dn.getChildren())
{
fsn.accept(this);
}
//remove this directory from the path
directories.removeLast();
}
}