【Java】读取其下所有文件夹与文件的路径

Java读取文件夹路径
本文介绍如何使用Java代码读取指定文件夹(f:/aa)下的所有文件及子文件夹的路径,包括非递归和递归两种方式,并提供完整的代码示例。

如果在f:\aa文件夹中,有如下图的文件夹与文件:


那么,在Java中,则如此读取f:/aa下的所有文件路径:

1、首先由于用到了文件与容器类下的ArrayList,所以在开头要引入如下包:

import java.io.*;
import java.util.*;

2、方法如下,其中File dirFile除了盘符,比如f:,以外,能够接受一切合法的路径。由于盘符下含有一些系统文件,拒绝访问,因为读取盘符,可能会出现空指针异常。

//这里是仅仅查询当前路径下的所有文件夹、文件并且存放其路径到文件数组
//由于遇到文件夹不查询其包含所有子文件夹、文件,因此没必要用到递归
public static ArrayList<String> Dir(File dirFile) throws Exception {
	ArrayList<String> dirStrArr = new ArrayList<String>();

	if (dirFile.exists()) {
		//直接取出利用listFiles()把当前路径下的所有文件夹、文件存放到一个文件数组
		File files[] = dirFile.listFiles();
		for (File file : files) {
			//如果传递过来的参数dirFile是以文件分隔符,也就是/或者\结尾,则如此构造
			if (dirFile.getPath().endsWith(File.separator)) {
				dirStrArr.add(dirFile.getPath() + file.getName());
			} else {
				//否则,如果没有文件分隔符,则补上一个文件分隔符,再加上文件名,才是路径
				dirStrArr.add(dirFile.getPath() + File.separator
						+ file.getName());
			}
		}
	}
	return dirStrArr;
}
其上的方法,是不读取f:\aa下的新建文件夹下的xlsx,如果在读取的过程中,遇到文件夹要同时读取其包含所有子文件夹、文件时,则要用到递归,先设置一个全局的动态数组:

public static ArrayList<String> dirAllStrArr = new ArrayList<String>();
然后方法如下:

public static void DirAll(File dirFile) throws Exception {

	if (dirFile.exists()) {
		File files[] = dirFile.listFiles();
		for (File file : files) {
			//如果遇到文件夹则递归调用。
			if (file.isDirectory()) {
				// 递归调用
				DirAll(file);
			} else {
				//如果遇到文件夹则放入数组
				if (dirFile.getPath().endsWith(File.separator)) {
					dirAllStrArr.add(dirFile.getPath() + file.getName());
				} else {
					dirAllStrArr.add(dirFile.getPath() + File.separator
							+ file.getName());
				}
			}
		}
	}
}
其实在读取的过程中,关键是利用listFiles()方法,获取本文件夹下的所有文件列表,之后和《【Java】移动文件夹及其所有子文件与子文件夹》( 点击打开链接),《【Java】利用文件输入输出流完成把一个文件夹内的所有文件拷贝的另一的文件夹的操作》( 点击打开链接)一样,遇到文件夹则进行递归。

上面整个方法的来起来是这样的一个java文件:

import java.io.*;
import java.util.*;

public class fileList {
	// 设置一个全局动态数组,来存放文件路径
	// 主要遍历文件夹,包含所有子文件夹、文件的情况时,用到递归,所以要这样设置
	public static ArrayList<String> dirAllStrArr = new ArrayList<String>();

	// 这里是仅仅查询当前路径下的所有文件夹、文件并且存放其路径到文件数组
	// 由于遇到文件夹不查询其包含所有子文件夹、文件,因此没必要用到递归
	public static ArrayList<String> Dir(File dirFile) throws Exception {
		ArrayList<String> dirStrArr = new ArrayList<String>();

		if (dirFile.exists()) {
			// 直接取出利用listFiles()把当前路径下的所有文件夹、文件存放到一个文件数组
			File files[] = dirFile.listFiles();
			for (File file : files) {
				// 如果传递过来的参数dirFile是以文件分隔符,也就是/或者\结尾,则如此构造
				if (dirFile.getPath().endsWith(File.separator)) {
					dirStrArr.add(dirFile.getPath() + file.getName());
				} else {
					// 否则,如果没有文件分隔符,则补上一个文件分隔符,再加上文件名,才是路径
					dirStrArr.add(dirFile.getPath() + File.separator
							+ file.getName());
				}
			}
		}
		return dirStrArr;
	}

	public static void DirAll(File dirFile) throws Exception {

		if (dirFile.exists()) {
			File files[] = dirFile.listFiles();
			for (File file : files) {
				// 如果遇到文件夹则递归调用。
				if (file.isDirectory()) {
					// 递归调用
					DirAll(file);
				} else {
					// 如果遇到文件夹则放入数组
					if (dirFile.getPath().endsWith(File.separator)) {
						dirAllStrArr.add(dirFile.getPath() + file.getName());
					} else {
						dirAllStrArr.add(dirFile.getPath() + File.separator
								+ file.getName());
					}
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		File dirFile = new File("f:/aa");
		System.out.println(Dir(dirFile));
		DirAll(dirFile);
		System.out.println(dirAllStrArr);
	}
}

运行结果如下:


### 遍历文件夹读取所有文件的方法 在Java中,可以通过`File`类提供的方法来遍历指定目录下的所有文件使用`FileInputStream`或`BufferedReader`等类读取文件内容。以下是一个完整的示例,展示如何递归遍历目录中的所有文件读取每个文件的内容。 #### 1. 使用递归方法遍历目录 `File`类提供了`listFiles()`方法,可以返回目录中的所有文件和子目录。通过递归调用,可以遍历整个目录树。 ```java import java.io.File; import java.io.FileInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class FileTraversal { public static void traverseDirectory(File directory) { if (directory.isDirectory()) { File[] files = directory.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { traverseDirectory(file); // 递归调用 } else { System.out.println("文件名: " + file.getAbsolutePath()); readFileContent(file); } } } } } public static void readFileContent(File file) { try (FileInputStream fis = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { File rootDirectory = new File("D:\\test"); // 替换为你的目标目录 traverseDirectory(rootDirectory); } } ``` #### 2. 代码说明 - **`traverseDirectory(File directory)`** 方法用于递归遍历目录。首先检查传入的`File`对象是否为目录,如果是,则获取该目录下的所有文件和子目录。对于每个文件,如果是目录,则递归调用`traverseDirectory()`方法;如果不是目录,则调用`readFileContent()`方法读取文件内容[^1]。 - **`readFileContent(File file)`** 方法使用`FileInputStream`和`BufferedReader`来逐行读取文件内容。`try-with-resources`语句确保在读取完成后自动关闭输入流,避免资源泄漏。 - **`main()`** 方法中,创建了一个`File`对象`rootDirectory`,表示要遍历的根目录。你可以根据需要修改`rootDirectory`的路径。 #### 3. 注意事项 - 在使用`listFiles()`方法时,需要检查返回的数组是否为`null`,以避免空指针异常。某些情况下,例如目录权限不足时,`listFiles()`可能会返回`null`。 - 文件读取过程中可能会抛出`IOException`,因此需要使用`try-catch`块捕获异常,进行适当的处理。 - 如果目录中包含大量文件递归调用可能会导致栈溢出。为了避免这种情况,可以考虑使用非递归的方式(例如使用队列或栈)来实现目录遍历。 #### 4. 其他应用场景 除了读取文件内容外,还可以将文件名存储到一个文本文件中,或者对文件内容进行进一步处理。例如,可以将文件内容写入数据库、进行文本分析等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值