Обзор потоков ввода-вывода Java

Импорт данных в Java

Anthony Markham

VP Quant Developer

Основы потоков

  • Потоки — однонаправленные каналы данных с порядком FIFO (First In, First Out)
  • Байтовые потоки работают с двоичными данными (InputStream/OutputStream)
  • Символьные потоки обрабатывают текст с автоматической кодировкой (Reader/Writer)

Представление потоков

Импорт данных в Java

Байтовые потоки

  • Используются для двоичных данных (изображения, аудио и т. д.)
  • Базовые абстрактные классы: InputStream (чтение), OutputStream (запись)
  • Основные реализации: FileInputStream, FileOutputStream
  • Ключевые методы: read() возвращает байты, write() выводит байты

Двоичные файлы: изображения и аудио

Импорт данных в Java

Байтовые потоки

try (FileInputStream fis = new FileInputStream("data.bin")) {

byte[] buffer = new byte[1024]; int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) { // Process bytes in buffer
System.out.println("Read " + bytesRead + " bytes"); }
} catch (Exception e) { System.err.println("Error: " + e.getMessage()); }
Импорт данных в Java

Символьные потоки

  • Предназначены для текстовых данных
  • Базовые абстрактные классы: Reader (чтение текста), Writer (запись текста)
  • Основные реализации: FileReader, FileWriter, BufferedReader, BufferedWriter
  • Удобный метод: readLine() читает целую строку текста

CSV-файлы

Импорт данных в Java

Символьные потоки

try (BufferedReader reader = new BufferedReader(new FileReader("data.csv"))) {
    String line;

while ((line = reader.readLine()) != null) { // Process each line System.out.println(line); }
} catch (Exception e) { System.err.println("Error: " + e.getMessage()); }
Импорт данных в Java

Буферизованные потоки — производительность

  • Повышает производительность за счёт сокращения операций с диском
  • Чтение/запись байтовых потоков: BufferedInputStream и BufferedOutputStream
  • Чтение/запись символьных потоков: BufferedReader, BufferedWriter
    • Чтение целой строки с помощью readLine()
Импорт данных в Java

Буферизованные потоки — производительность

try (BufferedReader reader = new BufferedReader(new FileReader("data.csv"))) {
    // Header processing
    String header = reader.readLine();
    System.out.println("Header: " + header);

// Efficient data reading String line; int count = 0; while ((line = reader.readLine()) != null) { count++; } System.out.println("Read " + count + " data rows"); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); }
Импорт данных в Java

Цепочки потоков

  • Каждый поток в цепочке добавляет определённую функциональность
  • Типичный паттерн: FileInputStream -> InputStreamReader -> BufferedReader
  • Всегда закрывайте внешний поток (остальные закроются автоматически)
Импорт данных в Java

Цепочки потоков

import java.nio.charset.StandardCharsets;
try (

BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("data.csv"),
StandardCharsets.UTF_8 )
)
) { String line; while ((line = reader.readLine()) != null) { System.out.println(line);} } catch (Exception e) { System.err.println("Error: " + e.getMessage()); }
Импорт данных в Java

Обработка исключений

  • Критически важны для операций ввода-вывода
  • Распространённые исключения: IOException, FileNotFoundException
  • Всегда используйте try-with-resources для обработки исключений
Импорт данных в Java

Обработка исключений

import java.util.ArrayList;
import java.util.List;
public static List<String> readLines(String filePath) throws IOException {

List<String> lines = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { lines.add(line); } } // Stream automatically closed here return lines;
}
Импорт данных в Java

Давайте потренируемся!

Импорт данных в Java

Preparing Video For Download...