Java 读取指定路径下的log

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

该回答引用ChatGPT

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

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

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

逐个读取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);
    }
}



以下是Java代码,用于将两个文件夹下同名log文件按照日期顺序整合到一个新的txt文件中:

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

public class MergeLogs {
    public static void main(String[] args) throws Exception {
        // 输入源文件夹路径和目标文件路径
        String sourceFolder1 = "path/to/source/folder1";
        String sourceFolder2 = "path/to/source/folder2";
        String destinationFile = "path/to/destination/file.txt";

        // 获取源文件夹1中所有的log文件
        File folder1 = new File(sourceFolder1);
        File[] listOfFiles1 = folder1.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".log");
            }
        });

        // 获取源文件夹2中所有的log文件
        File folder2 = new File(sourceFolder2);
        File[] listOfFiles2 = folder2.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".log");
            }
        });

        // 将两个文件夹中所有的log文件放在一个数组中
        File[] listOfFiles = new File[listOfFiles1.length + listOfFiles2.length];
        System.arraycopy(listOfFiles1, 0, listOfFiles, 0, listOfFiles1.length);
        System.arraycopy(listOfFiles2, 0, listOfFiles, listOfFiles1.length, listOfFiles2.length);

        // 对log文件按日期进行排序
        Arrays.sort(listOfFiles, new Comparator<File>() {
            public int compare(File f1, File f2) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                try {
                    Date d1 = sdf.parse(f1.getName().substring(0, 8));
                    Date d2 = sdf.parse(f2.getName().substring(0, 8));
                    return d1.compareTo(d2);
                } catch (ParseException e) {
                    e.printStackTrace();
                    return 0;
                }
            }
        });

        // 将log文件中的内容拼接到目标文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter(destinationFile));
        for (File file : listOfFiles) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
            br.close();
        }
        bw.close();

        System.out.println("Logs merged successfully!");
    }
}

代码中,首先需要输入源文件夹1、源文件夹2和目标文件路径。然后通过File类和FilenameFilter接口获取源文件夹1和源文件夹2中的所有log文件,并将它们放在一个数组中。接着使用Arrays.sort方法和Comparator接口按照日期对log文件进行排序。最后,使用BufferedWriter类将log文件中的内容拼接到目标文件中,并关闭文件流。完成后输出提示信息"Logs merged successfully!"。

  • 这篇文章讲的很详细,请看: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>