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

Найдите количество строк в файле с помощью Java

Узнайте, как найти количество строк в файле с помощью Java.

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

1. Обзор

В этом уроке мы узнаем, как найти количество строк в файле с помощью Java с помощью стандартных API ввода-вывода Java, Google Guava и библиотеки Apache Commons IO .

2. Файлы NIO2

Обратите внимание, что в этом руководстве мы будем использовать следующие примерные значения в качестве входного имени файла и общего количества строк:

static final String INPUT_FILE_NAME = "src/main/resources/input.txt";
static final int NO_OF_LINES = 45;

Java 7 внесла множество улучшений в существующие библиотеки ввода-вывода и упаковала их под NIO2:

Давайте начнем с Files и посмотрим, как мы можем использовать его API для подсчета количества строк:

@Test
public void whenUsingNIOFiles_thenReturnTotalNumberOfLines() throws IOException {
    try (Stream fileStream = Files.lines(Paths.get(INPUT_FILE_NAME))) {
        int noOfLines = (int) fileStream.count();
        assertEquals(NO_OF_LINES, noOfLines);
    }
}

Или просто используя метод Files#ReadAllLines :

@Test
public void whenUsingNIOFilesReadAllLines_thenReturnTotalNumberOfLines() throws IOException {
    List fileStream = Files.readAllLines(Paths.get(INPUT_FILE_NAME));
    int noOfLines = fileStream.size();
    assertEquals(NO_OF_LINES, noOfLines);
}

3. Файловый канал NIO

Теперь давайте проверим FileChannel, высокопроизводительную альтернативу Java NIO для чтения количества строк:

@Test
public void whenUsingNIOFileChannel_thenReturnTotalNumberOfLines() throws IOException {
    int noOfLines = 1;
    try (FileChannel channel = FileChannel.open(Paths.get(INPUT_FILE_NAME), StandardOpenOption.READ)) {
        ByteBuffer byteBuffer = channel.map(MapMode.READ_ONLY, 0, channel.size());
        while (byteBuffer.hasRemaining()) {
            byte currentByte = byteBuffer.get();
            if (currentByte == '\n')
                noOfLines++;
       }
    }
    assertEquals(NO_OF_LINES, noOfLines);
}

Хотя файловый канал был введен в JDK 4, приведенное выше решение работает только с JDK 7 или выше .

4. Файлы Google Guava

Альтернативной сторонней библиотекой может быть Google Guava Files class. Этот класс также можно использовать для подсчета общего количества строк аналогично тому, что мы видели с Files#ReadAllLines .

Давайте начнем с добавления | гуавы зависимости в ваш pom.xml :


    com.google.guava
    guava
    28.0-jre

И тогда мы можем использовать readLines для получения Списка строк файла:

@Test
public void whenUsingGoogleGuava_thenReturnTotalNumberOfLines() throws IOException {
    List lineItems = Files.readLines(Paths.get(INPUT_FILE_NAME)
      .toFile(), Charset.defaultCharset());
    int noOfLines = lineItems.size();
    assertEquals(NO_OF_LINES, noOfLines);
}

5. Файлы ввода-вывода Apache Commons

Теперь давайте посмотрим Apache Commons IO |/FileUtils API, параллельное решение Guava.

Чтобы использовать библиотеку, мы должны включить зависимость commons-io в pom.xml :


    commons-io
    commons-io
    2.8.0

В этот момент мы можем использовать Apache Commons Io FileUtils#LineIterator , который очищает некоторые из обработчиков файлов для нас:

@Test
public void whenUsingApacheCommonsIO_thenReturnTotalNumberOfLines() throws IOException {
    int noOfLines = 0;
    LineIterator lineIterator = FileUtils.lineIterator(new File(INPUT_FILE_NAME));
    while (lineIterator.hasNext()) {
        lineIterator.nextLine();
        noOfLines++;
    }
    assertEquals(NO_OF_LINES, noOfLines);
}

Как мы видим, это немного более подробно, чем решение Google Guava.

6. BufferedReader

Итак, как насчет старомодных способов? Если мы не находимся на JDK 7 и не можем использовать стороннюю библиотеку, у нас есть BufferedReader:

@Test
public void whenUsingBufferedReader_thenReturnTotalNumberOfLines() throws IOException {
    int noOfLines = 0;
    try (BufferedReader reader = new BufferedReader(new FileReader(INPUT_FILE_NAME))) {
        while (reader.readLine() != null) {
            noOfLines++;
        }
    }
    assertEquals(NO_OF_LINES, noOfLines);
}

7. LineNumberReader

Или мы можем использовать LineNumberReader, прямой подкласс BufferedReader , который немного менее подробен:

@Test
public void whenUsingLineNumberReader_thenReturnTotalNumberOfLines() throws IOException {
    try (LineNumberReader reader = new LineNumberReader(new FileReader(INPUT_FILE_NAME))) {
        reader.skip(Integer.MAX_VALUE);
        int noOfLines = reader.getLineNumber() + 1;
        assertEquals(NO_OF_LINES, noOfLines);
    }
}

Здесь мы вызываем метод skip , чтобы перейти к концу файла, и мы добавляем 1 к общему количеству строк , так как нумерация строк начинается с 0.

8. Сканер

И, наконец, если мы уже используем Scanner как часть более масштабного решения, это может решить проблему и для нас:

@Test
public void whenUsingScanner_thenReturnTotalNumberOfLines() throws IOException {
    try (Scanner scanner = new Scanner(new FileReader(INPUT_FILE_NAME))) {
        int noOfLines = 0;
        while (scanner.hasNextLine()) {
            scanner.nextLine();
            noOfLines++;
        }
        assertEquals(NO_OF_LINES, noOfLines);
    }
}

9. Заключение

В этом уроке мы рассмотрели различные способы определения количества строк в файле с помощью Java. Поскольку основная цель всех этих API-интерфейсов не заключается в подсчете количества строк в файле, рекомендуется выбрать правильное решение для наших нужд.

Как всегда, исходный код этого учебника доступен на GitHub .