Рубрики
Без рубрики

Чтение строки с заданным номером строки из файла на Java

Изучите различные способы чтения строки с заданным номером строки внутри файла

Автор оригинала: Cristian Rosu.

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. Использование сканера

Другой аналогичный подход, который мы можем использовать, – это использование сканера:

@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 и Сканер может быть не заметно, что в больших файлах Сканер будет медленнее, так как он также делает ли парсинг и имеет меньший размер буфера.

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. Большие файлы

Если нам нужно работать с большими файлами, мы должны использовать линии метод, который возвращает Течение чтобы мы могли читать файл строка за строкой:

@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 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 .