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("————————————————————————————————");
        );
    

【讨论】:

谢谢。这确实有效! 这部分我没看懂。 Map> linesOfFiles = new TreeMap>();` Maps 是存储属于某个键的值的数据结构。在这种情况下,键是文件名,对应的值是行列表。文件名和行都是Strings,这就是map 的结构为Map&lt;Key, Value&gt; 的原因。这基本上是存储成对的文件名和该文件的内容。您可以在tutorial about the Map interface 中阅读更多相关信息。【参考方案2】:

标准的 Java 8 方法是简单地迭代给定目录中的所有 Paths:

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从文件夹中的所有文件中一一读取数据? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从JAVA中的子文件夹中每次发送一个类的文件路径

如何从Java中的文件中删除换行符?

java中如何获取目录中的所有文件

Java如何从文件中打印与给定模式匹配的所有字符串?

如何从我的 Android 应用程序中的所有目录中获取所有 pdf 文件

如何使用java程序批量修改特定文件夹下的文件名