2015-07-04 3 views
0

Я ищу эффективный способ разбить текстовый файл на набор ArrayList. Текстовый файл - это дамп Thread, и я бы хотел создать список для каждого отдельного потока. Каждый поток разделяется пустой строкой. Например, взятая следующий файл:Java: сплит текстовый файл в несколько списков

"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) 
. . . . 

Что бы вы посоветовали сделать ? (Итерация, регулярное выражение ..) Спасибо

+0

Итерация по линиям, вставка в зависимости от считанных данных для правильного списка –

+0

Как большой ваш входной файл? Вы, скорее всего, не хотите загружать большой файл журнала в память сразу, но использовать потоки. –

+0

Почему вы хотите написать результат в ArrayLists? Вы также можете записать их в отдельные файлы напрямую. Используйте BufferedReader для ввода и PrintWriters для выходных файлов, и каждый раз, когда вы сталкиваетесь с пустой строкой, вы записываете текущую запись в соответствующий файл. – SpiderPig

ответ

3

Нет необходимости в регулярных выражениях, просто прочитать файл построчно ...

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); 
      } 
     } 
    } 
} 
+0

Это будет работать, только если 'thread-dump.txt' отсортирован по потоку. – SpiderPig

+0

Спасибо за предложение! – user2824073

Смежные вопросы