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

Для чего существуют потоки ввода

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

Комментарии (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);
        }
    }
}

Лучшие практики

  1. Всегда закрывайте потоки с try-with-resources
try (BufferedReader reader = new BufferedReader(
        new FileReader("file.txt"))) {
    // Читаем данные
}
  1. Используйте буферизированные потоки для больших файлов

Буфер значительно ускоряет чтение больших объемов данных.

  1. Обрабатывайте исключения правильно

Всегда ловите IOException при работе с потоками.

  1. Используй Files API для новых проектов
List<String> lines = Files.readAllLines(Paths.get("file.txt"));
lines.forEach(System.out::println);