1. Обзор
В этой быстрой статье мы рассмотрим различные способы чтения строки с заданным номером строки внутри файла.
2. Входной файл
Давайте начнем с создания простого файла с именем inputLines.txt
, который мы будем использовать во всех наших примерах:
Line 1
Line 2
Line 3
Line 4
Line 5
3. Использование BufferedReader
Давайте посмотрим на хорошо известный класс BufferedReader
и его преимущество в том, что он не сохраняет весь файл в памяти.
Мы можем читать файл построчно и останавливаться, когда захотим:
@Test
public void givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect() {
try (BufferedReader br = Files.newBufferedReader(Paths.get(FILE_PATH))) {
for (int i = 0; i < 3; i++) {
br.readLine();
}
String extractedLine = br.readLine();
assertEquals("Line 4", extractedLine);
}
}
4. Использование сканера
Другой аналогичный подход, который мы можем использовать, — это использование Scanner
:
@Test
public void givenFile_whenUsingScanner_thenExtractedLineIsCorrect() {
try (Scanner scanner = new Scanner(new File(FILE_PATH))) {
for (int i = 0; i < 3; i++) {
scanner.nextLine();
}
String extractedLine = scanner.nextLine();
assertEquals("Line 4", extractedLine);
}
}
Хотя на небольших файлах разница между BufferedReader
и Scanner
может быть незаметна, на больших файлах Scanner
будет работать медленнее, поскольку он также выполняет синтаксический анализ и имеет меньший размер буфера.
5. Использование файлового API
5.1. Маленькие файлы
Мы можем использовать Files.readAllLines()
из File API , чтобы легко прочитать содержимое файла в память и извлечь нужную строку:
@Test
public void givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() {
String extractedLine = Files.readAllLines(Paths.get(FILE_PATH)).get(4);
assertEquals("Line 5", extractedLine);
}
5.2. Большие файлы
Если нам нужно работать с большими файлами, мы должны использовать метод lines
, который возвращает Stream
, чтобы мы могли читать файл построчно:
@Test
public void givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() {
try (Stream lines = Files.lines(Paths.get(FILE_PATH))) {
String extractedLine = lines.skip(4).findFirst().get();
assertEquals("Line 5", extractedLine);
}
}
6. Использование Apache Commons IO
Другой вариант — использовать класс FileUtils пакета
commons-io , который считывает весь файл и возвращает строки в виде списка String
s:
@Test
public void givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect() {
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("linesInput.txt").getFile());
List<String> lines = FileUtils.readLines(file, "UTF-8");
String extractedLine = lines.get(0);
assertEquals("Line 1", extractedLine);
}
Мы также можем использовать класс IOUtils
для достижения того же результата, за исключением того, что на этот раз все содержимое возвращается в виде строки
, и мы должны сами выполнить разбиение:
@Test
public void givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect() {
String fileContent = IOUtils.toString(new FileInputStream(FILE_PATH), StandardCharsets.UTF_8);
String extractedLine = fileContent.split(System.lineSeparator())[0];
assertEquals("Line 1", extractedLine);
}
7. Заключение
В этой быстрой статье мы рассмотрели наиболее распространенные способы чтения строки с заданным номером строки из файла.
Как обычно, примеры доступны на GitHub .