Recursively traversing files and folders using Java File API

In this section, let us see how to recursively traverse over files and folders by making use of Java File API. Whether it is a folder or a file, both are represented as a java.io.File object. For example, consider the following code snippet,

File myFile = new File("C:\myDocuments\myFile.txt"); // Case 1
File myFolder = new File("C:\myDocuments"); // Case 2

also read:

If both files and folders are represented as a single File object, then how can we differentiate between a File and a Folder? The File API provides convenient methods for determining this in the form of File.isDirectory() and File.isFile(). For example, in case 1, File.isDirectory() and File.isFile() returns false and true respectively, whereas for case 2, it is true and false.
For listing all the files in a particular directory, we can use the File.listFiles() method. When operated on a folder, it will return all the files in the File Array object. For example, consider the following code snippet,

 File myFolder = new File("C:\myDocuments");
File allMyFolderObjects[] = myFolder.listFiles();

In the above case, if we have two files (say file1.txt and file2.txt) and a folder (sub-folder) within myFolder, then the size of allMyFolderObjects will be three. Using the combination of the above methods we have seen, let us write code to recursively traverse over a folder object. Given below is the complete code for the same.
FolderTraversar.java

package tips.foldertraversal;

import java.io.File;

public class FolderTraversar {
	private String indent = "";
	private File originalFileObject;
	private File fileObject;

	public FolderTraversar(File fileObject) {
		this.originalFileObject = fileObject;
		this.fileObject = fileObject;
	}

	public void traverse() {
		recursiveTraversal(fileObject);
	}

	public void recursiveTraversal(File fileObject) {
		if (fileObject.isDirectory()) {
			indent = getIndent(fileObject);
			System.out.println(indent + fileObject.getName());
			File allFiles[] = fileObject.listFiles();
			for (File aFile : allFiles) {
				recursiveTraversal(aFile);
			}
		} else if (fileObject.isFile()) {
			System.out.println(indent + " " + fileObject.getName());
		}
	}

	private String getIndent(File fileObject) {
		String original = originalFileObject.getAbsolutePath();
		String fileStr = fileObject.getAbsolutePath();
		String subString = fileStr.substring(original.length(),
				fileStr.length());
		String indent = "";
		for (int index = 0; index < subString.length(); index++) {
			char aChar = subString.charAt(index);
			if (aChar == File.separatorChar) {
				indent = indent + " ";
			}
		}
		return indent;
	}
}

The above class FolderTraverser accepts a Folder object that we wish to traverse. Then, by calling the FolderTraverser.traverse() method, the folder can be traversed recursively. The implementation of traverse() delegates the control to a private method by name recursiveTraversal(). Initially we are checking whether the File object is a folder by calling the File.isDirectory() method. If so, we print the name of the folder and then retrieves the content of the Folder by calling the File.listFiles() method. The array is again recursively traversed. Note that just to make the output meaningful, we have calculated the indent of the various files and folder items to be displayed.
FolderTraversarTest.java

package tips.foldertraversal;

import java.io.File;

public class FolderTraversarTest {
	public static void main(String[] args) {
		String folderPath = "F:\Technical Writings\www.javabeat.net\Tips\AllSamples\AllTips\src\tips";
		FolderTraversar traversal = new FolderTraversar(new File(folderPath));
		traversal.traverse();
	}
}

The output of the above client program is,

tips
  eforloop
    EnhancedForLoopTest.java
    UDEForLoop.java
  pattern
    factory
      Button.java
      ButtonFactory.java
      FactoryClient.java
      LinuxButton.java
      WindowsButton.java
    singleton
      MyConnection.java
      MyConnectionConsumer.java
    state
...
...

Comments

comments

About Krishna Srinivasan

He is Founder and Chief Editor of JavaBeat. He has more than 8+ years of experience on developing Web applications. He writes about Spring, DOJO, JSF, Hibernate and many other emerging technologies in this blog.

Comments

  1. Very useful program!!!
    Thank you very much for your kindness to share it!

Speak Your Mind

*

Close
Please support the site
By clicking any of these buttons you help our site to get better