How can I read a large text file line by line using Java?
Как я могу прочитать большой текстовый файл построчно с помощью Java?
Мне нужно прочитать большой текстовый файл объемом около 5-6 ГБ построчно с помощью Java.
Как я могу сделать это быстро?
Переведено автоматически
Ответ 1
Распространенный шаблон заключается в использовании
try (BufferedReaderbr=newBufferedReader(newFileReader(file))) { String line; while ((line = br.readLine()) != null) { // process the line. } }
Вы можете прочитать данные быстрее, если предположите, что кодировка символов отсутствует. например, ASCII-7, но это не будет иметь большого значения. Весьма вероятно, что то, что вы делаете с данными, займет гораздо больше времени.
РЕДАКТИРОВАТЬ: менее распространенный шаблон для использования, который позволяет избежать line утечки.
try(BufferedReaderbr=newBufferedReader(newFileReader(file))) { for(String line; (line = br.readLine()) != null; ) { // process the line. } // line is not visible here. }
ПРИМЕЧАНИЕ: Вы должны поместить поток в блок try-with-resource, чтобы убедиться, что для него вызван метод #close , в противном случае дескриптор базового файла никогда не закрывается, пока GC не сделает это намного позже.
Вот пример с полной обработкой ошибок и поддержкой спецификации кодировки для версии до Java 7. В Java 7 вы можете использовать синтаксис try-with-resources, который делает код более чистым.
Если вам просто нужна кодировка по умолчанию, вы можете пропустить InputStream и использовать FileReader.
InputStreamins=null; // raw byte-stream Readerr=null; // cooked reader BufferedReaderbr=null; // buffered for readLine() try { String s; if (true) { Stringdata="#foobar\t1234\n#xyz\t5678\none\ttwo\n"; ins = newByteArrayInputStream(data.getBytes()); } else { ins = newFileInputStream("textfile.txt"); } r = newInputStreamReader(ins, "UTF-8"); // leave charset out for default br = newBufferedReader(r); while ((s = br.readLine()) != null) { System.out.println(s); } } catch (Exception e) { System.err.println(e.getMessage()); // handle exception } finally { if (br != null) { try { br.close(); } catch(Throwable t) { /* ensure close happens */ } } if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } } if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } } }