java - 如何使用Java从文件夹中的所有文件中一一读取数据? [复制]
Posted
技术标签:
【中文标题】java - 如何使用Java从文件夹中的所有文件中一一读取数据? [复制]【英文标题】:How to read data from all files one by one in a folder with Java? [duplicate] 【发布时间】:2019-02-21 11:19:36 【问题描述】:如何使用Java从一个文件夹中的所有文件(一个接一个)读取数据?
此代码仅返回文件名,我正在寻找更深入的搜索:
File folder = new File("/home/user_name/Downloads/textfiles/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles)
if (file.isFile())
System.out.println(file.getName());
【问题讨论】:
你想访问每个文件的内容吗? 是的。我想访问每个文件的内容 【参考方案1】:你可以在没有任何外部库的情况下做到这一点,只需要使用 java.nio。
程序如下:
代码采用String
作为路径并从中创建java.nio.Path
(在本例中使用常量String
路径完成)。然后它准备一个Map<String, List<Strings>
,将文件名及其内容存储为每行一个String
。之后,它使用DirectoryStream<Path>
从java.nio 将目录内容读取到文件路径列表中,并将Files.readAllLines(Path path)
读取的内容作为List<String>
和绝对文件路径存储在Map
中。
最后,它只是打印出所有读取的内容,并由一行长破折号分隔......
试试吧,也许对你的搜索有帮助。
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class FileContentReader
private static final String FOLDER_PATH = "Y:\\our\\destination\\folder\\";
public static void main(String[] args)
Path folderPath = Paths.get(FOLDER_PATH);
// prepare a data structure for a file's name and content
Map<String, List<String>> linesOfFiles = new TreeMap<String, List<String>>();
// retrieve a list of the files in the folder
List<String> fileNames = new ArrayList<>();
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(folderPath))
for (Path path : directoryStream)
fileNames.add(path.toString());
catch (IOException ex)
System.err.println("Error reading files");
ex.printStackTrace();
// go through the list of files
for (String file : fileNames)
try
// put the file's name and its content into the data structure
List<String> lines = Files.readAllLines(folderPath.resolve(file));
linesOfFiles.put(file, lines);
catch (IOException e)
e.printStackTrace();
// finally, print everything
linesOfFiles.forEach((String fileName, List<String> lines) ->
System.out.println("Content of " + fileName + " is:");
lines.forEach((String line) ->
System.out.println(line);
);
System.out.println("————————————————————————————————");
);
【讨论】:
谢谢。这确实有效! 这部分我没看懂。 MapMap
s 是存储属于某个键的值的数据结构。在这种情况下,键是文件名,对应的值是行列表。文件名和行都是String
s,这就是map
的结构为Map<Key, Value>
的原因。这基本上是存储成对的文件名和该文件的内容。您可以在tutorial about the Map interface 中阅读更多相关信息。【参考方案2】:
标准的 Java 8 方法是简单地迭代给定目录中的所有 Path
s:
Path inputDir = Paths.get("path/to/dir");
if (Files.isDirectory(inputDir))
List<Path> filePaths = Files.list(inputDir).collect(Collectors.toList());
for (Path filePath : filePaths)
// Load file contents...
您在循环中添加的内容取决于您的需求。您可以创建一个Reader
,根据您要使用的内存量和性能要求等,将行输出甚至内存映射。
【讨论】:
【参考方案3】:使用 commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
public static void main(String[] args)
try
File files = new File("\\home\\folder");
for (File file : files.listFiles())
List<String> lines = FileUtils.readLines(file);
System.out.println();
System.out.println();
System.out.println("******" + file.getName());
for (String line : lines)
System.out.println(line);
System.out.println(file.getName() + "******");
catch (IOException e)
e.printStackTrace();
【讨论】:
以上是关于java - 如何使用Java从文件夹中的所有文件中一一读取数据? [复制]的主要内容,如果未能解决你的问题,请参考以下文章