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");
return;
}
result = "";
outDir(mdir, 0);
list(mdir, 0);
outEndDir();
}
private void list(MyDir m, int level) {
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
outEndDir();
}
Vector mf = m.getFiles();
for (int i = 0; i < mf.size(); i++) {
MyFile f = (MyFile)mf.elementAt(i);
outFile(f,level);
}
}
}
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":
System.out.println(mf.getResult());
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|