Java:将文本文件拆分为多个列表

标签 java

我正在寻找一种有效的方法将文本文件拆分为一组 ArrayList。该文本文件是一个线程转储,我想为每个线程创建一个列表。每个线程都由空行分隔。 例如,采用以下文件:

"management-handler-thread - 66" prio=10 tid=0x00007fe960111000 nid=0x4cea waiting on condition [0x00007fe96c25c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006019cbbd0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
        at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)

"management-handler-thread - 65" prio=10 tid=0x00007fe968185800 nid=0x4ce9 waiting on condition [0x00007fe96c35d000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006019cbbd0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
        at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)

第一个列表应包含:

"management-handler-thread - 66" prio=10 tid=0x00007fe960111000 nid=0x4cea waiting on condition [0x00007fe96c25c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
. . .

第二个列表应包含:

"management-handler-thread - 65" prio=10 tid=0x00007fe968185800 nid=0x4ce9 waiting on condition [0x00007fe96c35d000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
. . . .

您建议做什么? (迭代、正则表达式..) 谢谢

最佳答案

不需要正则表达式,只需逐行读取文件...

List<List<String>> dumpedThreads = new ArrayList<>();
try (FileReader fr = new FileReader("path/to/thread-dump.txt")) {
    try (BufferedReader br = new BufferedReader(fr)) {
        List<String> thisThread = null;
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            if (line.trim().length() == 0) {
                thisThread = null;
            } else {
                if (thisThread == null) {
                    thisThread = new ArrayList<>();
                    dumpedThreads.add(thisThread);
                }
                thisThread.add(line);
            }
        }
    }
}

关于Java:将文本文件拆分为多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31225011/

相关文章:

java - 从名称和索引中选择图像

java - 接收可序列化对象并显示内容

java - 在 readline() 调用之后,Java 的 BufferedReader 是否在其内部缓冲区中留下字节?

java - 如何将当前方法的参数放入列表中

java - 使用 WebClient 时对 POST 请求正文进行单元测试

java - 使用 Apache commons cli 库尾随 args

java - 大的负模给出错误的结果

java - 从 Core Java 中的数组中删除重复元素

java - 推荐一个好的 JSF 分析器

java - Application.java Play Framework 中的重载方法