Вы не можете сделать это напрямую. Вы можете сделать это, читая и игнорируя первые строки, которые вам не нужны.
Вы можете сделать это с помощью 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
, или любые петли - это скорее личный вкус, это просто произвольные иллюстративные примеры.
Замечание о вашем последнем предложении: в качестве общего эмпирического правила используйте 'InputStream' (например,'FileInputStream' для двоичных (нетекстовых) данных и' Reader' (например, 'FileReader') для текстовых данных. Вы обнаружите, что API будет намного более кооперативным, если вы это сделаете. –
Файл на диске не сохраняется строками, вы не можете искать строку по своему усмотрению, вам нужно прочитать файл, подсчитать строки, затем прочитать строки, необходимые, а затем прекратить чтение будущих строк. Чтение кеша через «BufferedReader» ускорит ваше приложение. –