2013-10-09 13 views
3

Каков самый быстрый способ чтения больших файлов по строкам (файл содержит 1.000.000 строк) и разбор некоторых строк в java? Например, этот фрагмент моего файлаСамый быстрый способ чтения больших файлов в java

INFO 00:02:12 - returning228885634                
INFO 00:02:12 - Step is 1 for 228885634 statusOK duration 0.018    
INFO 00:02:12 - Step is 2 for 228885634 statusOK duration 1.55        
INFO 00:02:13 - START executing FOR test32967 at Mon Sep 23 00:02:13 GMT+00:00 2013  
INFO 00:02:13 - Currently working 7 

И я хочу только разобрать идентификатор Теста в (32967) из этого фрагмента!

+0

ли префикс всегда как 'INFO хх: уу: ZZ - начать выполнение для'? – ppeterka

+0

Вы что-нибудь о [threads] (http://arashmd.blogspot.com/2013/06/java-threading.html)? –

+0

ppeterka Нет префиксов могут быть разными, например test3620: 1 OK 0.018 – user2842269

ответ

1

Трудно побить BufferedReader за такие вещи.

try { 
    BufferedReader reader = new BufferedReader(new FileReader(file)); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
    //do something with line 
    } 
} finally { 
    try { 
    reader.close(); 
    } catch (IOException e) { 
    } 
} 
+0

Мне нужно прочитать файл из одной конкретной позиции в другую – user2842269

+0

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

+0

в байтах, у меня есть двоичный поиск, который возвращает эту позицию в байт, откуда я хочу начать чтение – user2842269

0

Для обработки большого файла вы могли бы использовать классы из нового пакета Java для лечения IO nio пакета предлагает разнообразный механизм для управления этого типа файла со значительно производительностью.

см http://docs.oracle.com/javase/7/docs/api/java/nio/channels/package-summary.html

3

Вы можете попробовать так: -

try (SeekableByteChannel bytechanel= Files.newByteChannel(Paths.get("abc.txt"))) { 
    ByteBuffer byte1 = ByteBuffer.allocateDirect(1000); 
    for(;;) { 
     StringBuilder s = new StringBuilder(); 
     int n = bytechanel.read(byte1); 
     // some code 
    } 
} 

Также ищите java.nio.* пакетов

+1

Было бы интересно узнать, работает ли это быстрее, чем BufferedReader, когда вы также учитываете необходимый синтаксический анализ строк. –

+0

Каков оптимальный способ анализа строк в nio? –

+0

@JonasKlemming: - Помогает ли это ответить на ваш запрос: - http://technicalmumbojumbo.wordpress.com/2011/03/17/file-io-old-io-or-nio-which-is-better/? –

1

Files.readLines() метод Используйте гуавы, для которого вы можете предоставить LineProcessor.

Files.readLines(new File("a_file.ext"), Charsets.UTF_8, new LineProcessor<String>() { 

    @Override 
    public boolean processLine(String line) throws IOException { 
     return line.contains("some identifier"); 
    } 

    @Override 
    public String getResult() { // the @tring here is the generic type of LineProcessor, change it to whatever 
     //create a result, get your id or ids 
     return ""; 
    } 
}); 
0

Если вы используете Java 8, вы можете попробовать это с помощью файлов классов и потоков.

Например:

Files.newBufferedReader(Paths.get("somefile")).lines().map((t)-> r).collect(Collectors.toList()); 

выглядит Также для java.nio.files и другие классы от java.nio.*

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