Java如何读取指定路径文件夹内的所有文件并输出内容?
实现批量读取目录下所有文件的方案
核心调整思路
你当前的代码是硬编码了data1.txt的单个文件路径,要实现批量读取,只需要先拿到目标目录的路径,遍历目录下的所有普通文件,循环复用你已有的单文件读取逻辑即可,不需要额外修改原有的文件读取核心代码。
具体实现要点
- 先做目录合法性校验:避免路径不存在、或者路径错指向单个文件时直接抛出未捕获的IO异常
- 遍历目录第一层的所有条目,过滤掉子目录、特殊文件,只保留需要读取的普通文件
- 复用原有读取逻辑处理每个文件,增加文件名标识方便区分不同文件的输出内容,同时显式指定文件编码避免乱码
- 拆分异常处理逻辑:单个文件读取失败不会中断整体的批量读取流程
完整可运行代码
如果你的项目已经引入了Spring相关依赖(也就是你之前用的ResourceUtils所在的环境),可以直接兼容原有写法改造,代码如下:
import org.springframework.util.ResourceUtils; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.stream.Stream; // 拿到目标目录对象,和你原有代码的ResourceUtils写法保持一致 File dir = ResourceUtils.getFile("c:/records/today/"); Path targetDir = dir.toPath(); // 目录合法性校验 if (!Files.exists(targetDir) || !Files.isDirectory(targetDir)) { System.out.println("指定路径不是有效目录,请检查路径配置"); return; } // 遍历目录下所有普通文件循环读取 try (Stream<Path> filePathStream = Files.list(targetDir)) { filePathStream // 仅保留普通文件,跳过子目录 .filter(Files::isRegularFile) // 如果需要仅读取txt格式文件,可额外加一行过滤: // .filter(path -> path.getFileName().toString().endsWith(".txt")) .forEach(filePath -> { try { // 完全复用你原有读文件的逻辑,仅额外指定UTF-8编码避免乱码 String content = new String(Files.readAllBytes(filePath), StandardCharsets.UTF_8); // 打印时标注文件名,方便区分不同文件的内容 System.out.printf("===== 文件 [%s] 内容 =====%n", filePath.getFileName()); System.out.println(content); } catch (IOException e) { System.out.printf("读取文件 [%s] 失败: %s%n", filePath.getFileName(), e.getMessage()); } }); } catch (IOException e) { System.out.println("遍历目标目录失败: " + e.getMessage()); }
额外说明
- 这里用
Files.list遍历只会读取目录第一层的文件,不会递归读取子目录下的内容,刚好匹配你当前目录下只有data1.txt、data2.txt两个文件的场景 - 原代码里的
new String(Files.readAllBytes(...))没有指定编码,在Windows系统下默认会用GBK编码,Linux/macOS下默认用UTF-8,容易出现中文乱码,显式指定StandardCharsets.UTF_8可以解决跨环境的乱码问题 - 如果不需要Spring环境,只需要把开头获取
targetDir的部分替换成Path targetDir = Paths.get("c:/records/today/");即可,不需要依赖ResourceUtils
内容的提问来源于stack exchange,提问作者jajaja
相关产品推荐
相关产品推荐

