Files and Directories in Java | Directory Structure

Working with files and directories in Java
The MyDir class
A directory structure for testing
Now for some HTML output
Showing XML in Internet Explorer

A directory structure for testing

For testing our programs we need a simple directory structure, with a few files and a few directories. Something along the lines of this:

- Figure 1 -

Here we have two files in "Dir-A", and one in each of the other two directories. If we run "Test1" above with the parameter "c:\Dir-A" we get this output:

Dir: c:\Dir-A
Dir: c:\Dir-A\Dir-B
Dir: c:\Dir-A\Dir-B\Dir-C
File: c:\Dir-A\Dir-B\Dir-C\File C.txt
File: c:\Dir-A\Dir-B\File B.txt
File: c:\Dir-A\File A1.txt
File: c:\Dir-A\File A2.txt

The output seems to be correct, but is of course not as nice as the graphical result in Figure 1.

Let's stop for a while and consider what could be improved in the current solution. First of all the output from the "list" method could be more readable, maybe by using some kind of indentation like in the graphical view. This could be achieved by adding a "level" parameter to the "list" method which is increased by one for every recursive call to "list". We could then indent each line for example 2 times "level" spaces. At the same time we could omit the path value. This would give this output:

Dir: Dir-A
  Dir: Dir-B
    Dir: Dir-C
      File: File C.txt
    File: File B.txt
  File: File A1.txt
  File: File A2.txt

Much better, but why tie up the solution to delivering the output only to System.out? We could have a much more generic solution if we define a couple of methods that contain the implementation of the output formatting and have them store the output in a member variable in the class. A get-method can be used to retrieve the final, formatted string.

Coding a more general solution

I'll sketch this solution here (the new code is marked with bold):

public class MyFileStructure{ 
  private String dirname;
  private MyDir mdir;
  protected String result;

public String getResult() {
    return result;

. . . 
  * Display the name of the file on System.out   
  protected void outFile(MyFile f, int level) {
    String name = f.getName();
    result += repeat(" ",2*level) + "File: " + name + "\n";
  * Display the name of the directory on System.out
  protected void outDir(MyDir d, int level) {
    String name = d.getName();
    result += repeat(" ",2*level) + "Dir: " + name + "\n";
  * Close display of the directory 
  protected void outEndDir() {
  public void list() {
    if (mdir == null) {
      System.out.println("Not a valid directory");
    result = "";
    outDir(mdir, 0);
    list(mdir, 0);
  private void list(MyDir m, int level) {
    Vector md = m.getDirs();
    for (int i = 0; i < md.size(); i++) {
      MyDir d = (MyDir)md.elementAt(i);
      outDir(d, level);
      list(d, level); // recursive call
    Vector mf = m.getFiles();
    for (int i = 0; i < mf.size(); i++) {
      MyFile f = (MyFile)mf.elementAt(i);

The complete MyFileStructure also includes a utility method "repeat".

The test program will now have to write the results to System.out, so we must add this line to the program "Test1":