← Назад к вопросам
Как прочитать текстовый файл используя класс 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 для автоматического закрытия