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 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.

package tips.foldertraversal;


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() {

	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) {
		} 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(),
		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.

package tips.foldertraversal;


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

The output of the above client program is,


Leave a Reply

Your email address will not be published. Required fields are marked *

Pin It on Pinterest

Share This

Share this post with your friends!