Java 读取指定路径下的log

用Java把两个文件夹下的同名log并把log内的数据(有日期)按日期顺序整合成一个新的txt文档,每个log里大概7万条数据

该回答引用ChatGPT

要实现将两个文件夹下的同名log按日期顺序整合成一个新的txt文档的功能,您可以按照以下步骤操作:

1、获取两个文件夹下的log文件列表:使用Java的File类和listFiles()方法获取两个文件夹下的log文件列表。您可以使用FileFilter来筛选出.log文件。

2、按日期排序:对于每个文件夹下的log文件列表,您可以使用Collections.sort()方法按照文件名的日期排序。您可以使用正则表达式来提取文件名中的日期信息,并将文件名转换为Date类型进行排序。

3、逐个读取log文件并写入新的txt文档:对于排序后的log文件列表,逐个读取每个log文件,并将其写入新的txt文档中。您可以使用Java的BufferedReader和BufferedWriter类来实现文件读写操作。

下面是一个实现上述功能的Java代码示例:


import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class MergeLogFiles {

    public static void main(String[] args) throws Exception {
        // 定义两个log文件夹的路径
        String folderPath1 = "D:/logs1";
        String folderPath2 = "D:/logs2";
        // 定义新的txt文档路径
        String outputPath = "D:/merged_logs.txt";

        // 获取两个文件夹下的log文件列表
        List<File> fileList = new ArrayList<>();
        fileList.addAll(getLogFiles(folderPath1));
        fileList.addAll(getLogFiles(folderPath2));

        // 按日期排序
        Collections.sort(fileList, (f1, f2) -> {
            Date date1 = getLogDate(f1.getName());
            Date date2 = getLogDate(f2.getName());
            return date1.compareTo(date2);
        });

        // 逐个读取log文件并写入新的txt文档
        BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath));
        for (File file : fileList) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
            reader.close();
        }
        writer.close();
    }

    // 获取指定文件夹下的log文件列表
    private static List<File> getLogFiles(String folderPath) {
        List<File> fileList = new ArrayList<>();
        File folder = new File(folderPath);
        if (folder.exists() && folder.isDirectory()) {
            File[] files = folder.listFiles(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.endsWith(".log");
                }
            });
            if (files != null) {
                for (File file : files) {
                    fileList.add(file);
                }
            }
        }
        return fileList;
    }

    // 从log文件名中提取日期信息
    private static Date getLogDate(String fileName) throws Exception {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        int start = fileName.indexOf("log-") + 4;
        int end = fileName.indexOf(".log");
        String dateString = fileName.substring(start, end);
        return dateFormat.parse(dateString);
    }
}


先说说我的大致思路,按照流式进行读取,记录时间和数据,在内存中保存时间和行号,通过插入的方式讲流的数据插入文本中

1、可能需要创建两个reader来分别读取两个目录下的log文件;
2、分别读取两个日志文件的一行;
3、解析出每行内容的时间,将时间小的那一行数据写到新文件中;将时间大的那条数据暂存,不做处理;
4、从第三步中,时间小的那个文件中再读取一行数据,解析时间,并与刚才暂存的那条数据的时间进行比较,小的写入文件,大的暂存;
重复3、4步,实现按时间排序。
前提:每个log文件中的数据是按时间排好序的;

  • 文章:java中的log使用 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: java中的log使用中的 依赖 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
    </dependency>