Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Потоки ввода (Input Streams) в Java
Определение
Потоки ввода (Input Streams) — это классы в Java, которые предоставляют механизм для последовательного чтения данных из различных источников. Они позволяют читать данные в виде последовательности байтов или символов.
Основное назначение потоков ввода
1. Чтение данных из файлов
Одно из основных применений — читать содержимое файлов:
import java.io.*;
public class FileReading {
public static void main(String[] args) throws IOException {
try (FileInputStream fis = new FileInputStream("data.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
}
}
}
2. Чтение данных из консоли
Потоки ввода позволяют получать входные данные от пользователя:
public class ConsoleInput {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Введите имя: ");
String name = reader.readLine();
System.out.println("Привет, " + name);
}
}
3. Чтение из сетевых соединений
Потоки ввода используются для чтения данных, полученных по сети:
public class SocketReading {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("example.com", 80);
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}
4. Чтение из базы данных (BLOB)
public class DatabaseReading {
public static void main(String[] args) throws SQLException, IOException {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT file_content FROM files WHERE id=1");
if (rs.next()) {
Blob blob = rs.getBlob("file_content");
InputStream inputStream = blob.getBinaryStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
// Обработка данных
}
}
}
}
Иерархия потоков ввода
В Java существует три основных абстрактных класса для чтения:
- InputStream — для чтения байтов
- Reader — для чтения символов
- Scanner — для удобного парсирования различных форматов
Основные типы потоков ввода
1. FileInputStream и FileReader
FileInputStream fis = new FileInputStream("image.jpg");
FileReader fr = new FileReader("text.txt");
2. BufferedInputStream и BufferedReader
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("large.dat"), 8192);
BufferedReader br = new BufferedReader(
new FileReader("file.txt"));
String line = br.readLine();
3. DataInputStream
DataInputStream dis = new DataInputStream(
new FileInputStream("data.bin"));
int number = dis.readInt();
4. Scanner
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
String word = scanner.next();
Практические примеры
Пример 1: Чтение текстового файла построчно
public class FileReading {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(
new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}
}
Пример 2: Чтение CSV файла
public class CSVReader {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(
new FileReader("data.csv"))) {
String line;
while ((line = reader.readLine()) != null) {
String[] fields = line.split(",");
for (String field : fields) {
System.out.print(field.trim() + " | ");
}
}
}
}
}
Пример 3: Чтение с фильтрацией
public class FileWithFilter {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(
new FileReader("data.txt"))) {
reader.lines()
.filter(line -> line.length() > 0)
.filter(line -> !line.startsWith("#"))
.forEach(System.out::println);
}
}
}
Лучшие практики
- Всегда закрывайте потоки с try-with-resources
try (BufferedReader reader = new BufferedReader(
new FileReader("file.txt"))) {
// Читаем данные
}
- Используйте буферизированные потоки для больших файлов
Буфер значительно ускоряет чтение больших объемов данных.
- Обрабатывайте исключения правильно
Всегда ловите IOException при работе с потоками.
- Используй Files API для новых проектов
List<String> lines = Files.readAllLines(Paths.get("file.txt"));
lines.forEach(System.out::println);