• Menu
  • Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

JavaBeat

Java Tutorial Blog

  • Java
    • Java 7
    • Java 8
    • Java EE
    • Servlets
  • Spring Framework
    • Spring Tutorials
    • Spring 4 Tutorials
    • Spring Boot
  • JSF Tutorials
  • Most Popular
    • Binary Search Tree Traversal
    • Spring Batch Tutorial
    • AngularJS + Spring MVC
    • Spring Data JPA Tutorial
    • Packaging and Deploying Node.js
  • About Us
    • Join Us (JBC)
  • Java
    • Java 7
    • Java 8
    • Java EE
    • Servlets
  • Spring Framework
    • Spring Tutorials
    • Spring 4 Tutorials
    • Spring Boot
  • JSF Tutorials
  • Most Popular
    • Binary Search Tree Traversal
    • Spring Batch Tutorial
    • AngularJS + Spring MVC
    • Spring Data JPA Tutorial
    • Packaging and Deploying Node.js
  • About Us
    • Join Us (JBC)

Recursively traversing files and folders using Java File API

August 27, 2007 //  by Krishna Srinivasan

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:

  • Java Tutorials
  • Java EE Tutorials
  • Design Patterns Tutorials
  • Java File IO Tutorials

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

Category: JavaTag: File IO

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.

Previous Post: «java Factory Design Pattern
Next Post: jUDDI and Configuration in jBoss and MySQL database »

Primary Sidebar

Follow Us

  • Facebook
  • Pinterest

FEATURED TUTORIALS

How to Write Comparators as Lambda Expressions in Java

What is new in Java 6.0 Collections API?

The Java 6.0 Compiler API

Introductiion to Jakarta Struts

What’s new in Struts 2.0? – Struts 2.0 Framework

JavaBeat

Copyright © by JavaBeat · All rights reserved
Privacy Policy | Contact