2016-08-27 6 views
3

Я новичок в программировании на Java, и я не смог найти ответ на мою проблему в любом месте.Чтение файла с использованием Java с указанием начального и конечного номера строки

Как читать несколько строк файла и хранить его в String (или список строк).

Например, из файла 1000 строк мне нужно читать только 200 строк, начиная с 200-й линии до 400-й строки.

Я натолкнулся на FileInputStream, используя его, мы можем определить начальное положение, но мы не можем определить конечную позицию.

+0

Замечание о вашем последнем предложении: в качестве общего эмпирического правила используйте 'InputStream' (например,'FileInputStream' для двоичных (нетекстовых) данных и' Reader' (например, 'FileReader') для текстовых данных. Вы обнаружите, что API будет намного более кооперативным, если вы это сделаете. –

+0

Файл на диске не сохраняется строками, вы не можете искать строку по своему усмотрению, вам нужно прочитать файл, подсчитать строки, затем прочитать строки, необходимые, а затем прекратить чтение будущих строк. Чтение кеша через «BufferedReader» ускорит ваше приложение. –

ответ

8

Вы не можете сделать это напрямую. Вы можете сделать это, читая и игнорируя первые строки, которые вам не нужны.

Вы можете сделать это с помощью Java LineNumberReader. Используйте его для чтения файла, считая одну строку за раз. Продолжайте читать и игнорировать строки, пока не дойдете до линии 200, начать обработку данных, остановку, как только вы достигнете 400.

Примечание: Перед тем, как спросить, нет, LineNumberReader#setLineNumber делает не изменить позицию файла, он просто искусственно устанавливает сообщил номер строки:

По умолчанию нумерация строк начинается с шагом 0. Это число в каждой строке терминатора, как данные считываются, и может быть изменен с помощью вызова setLineNumber(int). Обратите внимание, однако, что setLineNumber(int) фактически не изменяет текущую позицию в потоке; он изменяет только значение, которое будет возвращено getLineNumber().

Другим вариантом является просто использовать BufferedReader, вызывая readLine() 199 раз, чтобы перейти к 200-й линии, а затем читает строки рядом 200 (или любой другой). Но, LineNumberReader просто удобно отслеживает номер строки для вас.

Третий вариант, так как Java 8, является использование streams API и сделать что-то вроде:

Files.lines(Paths.get("input.txt")) 
    .skip(200) // skip to line 200 
    .limit(200) // discard all but the 200 lines following this 
    .forEach(...) 

Передача вашей обработки Consumer в forEach().

В любом случае, такая же концепция: вы должны прочитать и отбросить первые N строк файла, вы не сможете обойти это.


Пример с LineNumberReader:

LineNumberReader reader = new LineNumberReader(new FileReader("input.txt")); 

for (String line = reader.readLine(); line != null; line = reader.readLine()) { 
    if (reader.getLineNumber() > 400) { 
     break; // we're done 
    } else if (reader.getLineNumber() >= 200) { 
     // do something with 'line' 
    } 
} 

Пример с BufferedReader, не совсем так просто, как указано выше:

BufferedReader reader = new BufferedReader(new FileReader("input.txt")); 

// skip to the 200th line 
for (int n = 0; n < 199 && reader.readLine() != null; ++ n) 
    ; 

// process the next 201 (there's 201 lines between 200 and 400, inclusive) 
String line; 
for (int n = 0; n < 201 && (line = reader.readLine()) != null; ++ n) { 
    // do something with 'line' 
} 

И пример использования Files уже приведены выше.

Как вы хотите организовать условия и испытания для EOF и т. Д. В ваших for или while, или любые петли - это скорее личный вкус, это просто произвольные иллюстративные примеры.

+0

Забыл об API потока. Также я надеюсь, что мои добавленные примеры не конфликтовали что-либо, дайте мне знать, если они отвлекут меня, и я избавлюсь от них. –

+1

Мне нравится решение Java 8. +1 LineNumberReader - лучшее решение для java 7 anyday Спасибо за быстрый ответ! –

+0

@ManavVeerGulati Да, потоки материала очень классные, у меня нет возможности использовать его много, потому что я много работаю над устаревшими платформами и приложениями, ограниченными более старыми версиями Java. –