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();
	    }
	}