← Назад к вопросам

Как прочитать текстовый файл используя класс File

1.0 Junior🔥 141 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Чтение текстового файла с использованием класса File

Класс File в Java используется для работы с файлами и директориями, но сам по себе не читает содержимое. Для чтения нужны комбинации с потоками данных. Покажу все основные подходы.

Подход 1: FileReader + BufferedReader (Классический)

Это один из самых надёжных способов:

import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

File file = new File("data.txt");

try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Преимущества:

  • Эффективен для больших файлов (читает по строкам)
  • BufferedReader буферизирует данные
  • Try-with-resources автоматически закрывает ресурсы

Недостатки:

  • Много кода
  • Нужно обрабатывать IOException

Подход 2: FileInputStream для бинарных данных

Если нужно читать файл как поток байтов:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

File file = new File("data.txt");

try (FileInputStream fis = new FileInputStream(file)) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    
    while ((bytesRead = fis.read(buffer)) != -1) {
        System.out.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Когда использовать: для бинарных файлов, архивов, изображений.

Подход 3: Files.readAllLines() (Java 7+) — Самый простой

Новый подход с NIO — самый удобный для малых файлов:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

try {
    List<String> lines = Files.readAllLines(Paths.get("data.txt"));
    for (String line : lines) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Преимущества:

  • Минимум кода
  • Автоматически закрывает ресурсы
  • Работает с Path, а не File (более гибко)

Недостатки:

  • Загружает весь файл в память
  • Может быть медленнее на очень больших файлах

Подход 4: Files.readAllBytes() — для бинарных файлов

Читает весь файл в массив байтов:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;

try {
    byte[] bytes = Files.readAllBytes(Paths.get("data.txt"));
    String content = new String(bytes, StandardCharsets.UTF_8);
    System.out.println(content);
} catch (IOException e) {
    e.printStackTrace();
}

Подход 5: Files.lines() (Java 8+) — Stream API

Для обработки больших файлов с использованием потоков:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;

try (var stream = Files.lines(Paths.get("data.txt"))) {
    stream
        .filter(line -> !line.isEmpty())
        .map(String::toUpperCase)
        .forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

Преимущества:

  • Работает с потоками (ленивое вычисление)
  • Удобная обработка с filter, map и т.д.
  • Экономит память для больших файлов

Подход 6: Проверка существования и типа файла

Перед чтением лучше проверить файл:

import java.io.File;
import java.io.IOException;

File file = new File("data.txt");

// Проверяем существование
if (!file.exists()) {
    System.out.println("Файл не найден");
    return;
}

// Проверяем, что это файл, а не директория
if (!file.isFile()) {
    System.out.println("Это не файл");
    return;
}

// Проверяем, что можем читать
if (!file.canRead()) {
    System.out.println("Нет прав на чтение");
    return;
}

// Читаем файл
String path = file.getAbsolutePath();
System.out.println("Читаю: " + path);

Полный пример с обработкой ошибок

import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReader {
    public static void readFile(String filename) {
        File file = new File(filename);
        
        // Валидация
        if (!file.exists()) {
            System.err.println("Ошибка: файл не найден");
            return;
        }
        
        if (!file.isFile()) {
            System.err.println("Ошибка: это не файл");
            return;
        }
        
        // Чтение
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            int lineNumber = 1;
            
            while ((line = reader.readLine()) != null) {
                System.out.printf("%3d: %s%n", lineNumber++, line);
            }
        } catch (IOException e) {
            System.err.println("Ошибка при чтении файла: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        readFile("data.txt");
    }
}

Сравнение подходов

МетодУдобствоПроизводительностьДля файлов
FileReader + BufferedReaderСреднееВысокаяБольшие
FileInputStreamСреднееВысокаяБинарные
Files.readAllLines()ВысокоеСреднееМалые/средние
Files.readAllBytes()ВысокоеСреднееБинарные (малые)
Files.lines()ВысокоеВысокаяБольшие

Рекомендации

  • Для строк: Files.readAllLines() или Files.lines()
  • Для больших файлов: BufferedReader или Files.lines()
  • Для бинарных данных: FileInputStream или Files.readAllBytes()
  • В production коде: используй try-with-resources для автоматического закрытия
Как прочитать текстовый файл используя класс File | PrepBro