Java for Beginner
695 subscribers
604 photos
165 videos
12 files
938 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Введение в I/O (Input/Output)

I/O (Input/Output) в Java — это операции ввода и вывода, которые позволяют программам взаимодействовать с внешними источниками данных, такими как файлы, консоль, сети и другие. Java предоставляет мощный и гибкий API для работы с I/O через пакеты java.io и java.nio.

Ключевые концепции I/O

Потоки (Streams)

Потоки в Java представляют собой абстракцию для чтения и записи данных.
Существует два основных типа потоков: байтовые (работают с байтами) и символьные (работают с символами).


Байтовые потоки (Byte Streams)

Используются для работы с бинарными данными.
Основные классы: InputStream и OutputStream.


Символьные потоки (Character Streams)

Используются для работы с текстовыми данными.
Основные классы: Reader и Writer.


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

Байтовые потоки предназначены для работы с байтами. Они полезны для чтения и записи бинарных данных, таких как изображения и аудиофайлы.

Основные байтовые потоки:

InputStream: абстрактный класс для чтения байтов.
FileInputStream: читает данные из файла.
ByteArrayInputStream: читает данные из массива байтов.
BufferedInputStream: читает данные с буферизацией, что повышает производительность.


OutputStream: абстрактный класс для записи байтов.
FileOutputStream: записывает данные в файл.
ByteArrayOutputStream: записывает данные в массив байтов.
BufferedOutputStream: записывает данные с буферизацией, что повышает производительность.


Пример работы с байтовыми потоками:
// Чтение из файла
try (FileInputStream fis = new FileInputStream("input.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}

// Запись в файл
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
String text = "Hello, World!";
fos.write(text.getBytes());
} catch (IOException e) {
e.printStackTrace();
}


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

Символьные потоки предназначены для работы с текстовыми данными. Они полезны для чтения и записи текстовых файлов.

Основные символьные потоки:

Reader: абстрактный класс для чтения символов.

FileReader: читает данные из текстового файла.
CharArrayReader: читает данные из массива символов.
BufferedReader: читает данные с буферизацией, что повышает производительность.


Writer: абстрактный класс для записи символов.

FileWriter: записывает данные в текстовый файл.
CharArrayWriter: записывает данные в массив символов.
BufferedWriter: записывает данные с буферизацией, что повышает производительность.


Пример работы с символьными потоками:
// Чтение из файла
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}

// Запись в файл
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
String text = "Hello, World!";
bw.write(text);
} catch (IOException e) {
e.printStackTrace();
}


#Java #Training #IO
Классы File и Path

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

Класс File

File — это класс, который представляет файл или директорию в файловой системе. Он предоставляет методы для выполнения различных операций с файлами и директориями.

Основные методы класса File:

Создание объекта File:
File file = new File("example.txt");


Проверка существования файла:
boolean exists = file.exists();


Создание нового файла:
boolean created = file.createNewFile();


Удаление файла:
boolean deleted = file.delete();


Получение имени файла:
String name = file.getName();


Получение пути файла:
String path = file.getPath();


Получение абсолютного пути файла:
String absolutePath = file.getAbsolutePath();


Проверка, является ли объект директорией:
boolean isDirectory = file.isDirectory();


Список файлов в директории:
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f.getName());
}


Пример работы с классом File:
File file = new File("example.txt");

// Проверка существования файла
if (!file.exists()) {
// Создание нового файла
try {
boolean created = file.createNewFile();
if (created) {
System.out.println("File created successfully.");
}
} catch (IOException e) {
e.printStackTrace();
}
}

// Получение информации о файле
System.out.println("File name: " + file.getName());
System.out.println("File path: " + file.getPath());
System.out.println("Absolute path: " + file.getAbsolutePath());
System.out.println("Is directory: " + file.isDirectory());

// Удаление файла
boolean deleted = file.delete();
if (deleted) {
System.out.println("File deleted successfully.");
}


Класс Path

Path — это интерфейс в пакете java.nio.file, представляющий путь в файловой системе. Класс Paths предоставляет статические методы для создания экземпляров Path.

Основные методы класса Path:

Создание объекта Path:
Path path = Paths.get("example.txt");


Получение имени файла:
Path fileName = path.getFileName();


Получение родительского пути:
Path parent = path.getParent();


Получение корневого элемента пути:
Path root = path.getRoot();


Проверка существования файла:
boolean exists = Files.exists(path);


Создание нового файла:

Files.createFile(path);


Удаление файла:
Files.delete(path);


Получение информации о файле:
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);


Пример работы с классом Path:

Path path = Paths.get("example.txt");

// Проверка существования файла
if (!Files.exists(path)) {
// Создание нового файла
try {
Path createdFilePath = Files.createFile(path);
System.out.println("File created at path: " + createdFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}

// Получение информации о файле
System.out.println("File name: " + path.getFileName());
System.out.println("Parent path: " + path.getParent());
System.out.println("Root path: " + path.getRoot());

// Удаление файла
try {
Files.delete(path);
System.out.println("File deleted successfully.");
} catch (IOException e) {
e.printStackTrace();
}


Сравнение File и Path

Структура данных:

File представляет файл или директорию как объект.
Path представляет путь к файлу или директории.


Функциональность:

File предоставляет методы для работы с файлами и директориями.
Path предоставляет более гибкие и мощные методы для работы с путями в файловой системе через пакеты java.nio.file.


Совместимость:

File используется в старом подходе к работе с I/O.
Path и связанные с ним классы (Files, Paths) являются частью нового подхода, введенного в Java 7, и предоставляют больше возможностей и гибкости.


#Java #Training #IO #File #Path
Чтение и запись файлов: FileReader, FileWriter

FileReader

FileReader — это класс в Java, который используется для чтения текстовых файлов. Он является подклассом InputStreamReader и предназначен для упрощения чтения текстовых данных из файлов.

Основные методы FileReader:

Конструкторы:

FileReader(String fileName): Создает объект FileReader, связанный с файлом с указанным именем.
FileReader(File file): Создает объект FileReader, связанный с объектом File.


Чтение данных:

int read(): Читает один символ из файла и возвращает его в виде целого числа. Возвращает -1 в случае достижения конца файла.
int read(char[] cbuf, int offset, int length): Читает символы в массив cbuf, начиная с позиции offset и до length символов.


Закрытие потока:

void close(): Закрывает поток и освобождает все ресурсы, связанные с ним.

Пример чтения файла с использованием FileReader:
import java.io.FileReader;
import java.io.IOException;

public class FileReaderExample {
public static void main(String[] args) {
try (FileReader reader = new FileReader("example.txt")) {
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


В этом примере создается объект FileReader, связанный с файлом example.txt. Затем файл читается символ за символом до тех пор, пока не достигнет конца файла.

FileWriter

FileWriter — это класс в Java, который используется для записи текстовых файлов. Он является подклассом OutputStreamWriter и предназначен для упрощения записи текстовых данных в файлы.

Основные методы FileWriter:

Конструкторы:

FileWriter(String fileName): Создает объект FileWriter, связанный с файлом с указанным именем.
FileWriter(File file): Создает объект FileWriter, связанный с объектом File.
FileWriter(String fileName, boolean append): Создает объект FileWriter, связанный с файлом с указанным именем, и указывает, нужно ли добавлять данные в конец файла (append).


Запись данных:

void write(int c): Записывает один символ в файл.
void write(char[] cbuf, int off, int len): Записывает часть массива символов в файл.
void write(String str): Записывает строку в файл.


Закрытие потока:

void close(): Закрывает поток и освобождает все ресурсы, связанные с ним.

Пример записи в файл с использованием FileWriter:
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("example.txt")) {
writer.write("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
}
}
}

В этом примере создается объект FileWriter, связанный с файлом example.txt. Затем в файл записывается строка "Hello, World!".

#Java #Training #IO
Буферизованные потоки: BufferedReader, BufferedWriter

BufferedReader

BufferedReader — это класс в Java, который используется для чтения текстовых данных из символьного потока с буферизацией. Буферизация позволяет значительно повысить производительность чтения, так как чтение данных из буфера быстрее, чем напрямую из файла или другого источника.

Основные методы BufferedReader:

Конструкторы:

BufferedReader(Reader in): Создает объект BufferedReader, связанный с указанным символьным потоком.
BufferedReader(Reader in, int sz): Создает объект BufferedReader с указанным размером буфера.


Чтение данных:

String readLine(): Читает одну строку текста. Возвращает null, если достигнут конец потока.
int read(): Читает один символ и возвращает его. Возвращает -1, если достигнут конец потока.
int read(char[] cbuf, int offset, int length): Читает символы в массив cbuf, начиная с позиции offset и до length символов.


Закрытие потока:


void close(): Закрывает поток и освобождает все ресурсы, связанные с ним.

Пример чтения файла с использованием BufferedReader:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


В этом примере создается объект BufferedReader, связанный с FileReader, читающим файл example.txt. Затем файл читается построчно до достижения конца файла.


BufferedWriter

BufferedWriter — это класс в Java, который используется для записи текстовых данных в символьный поток с буферизацией. Буферизация позволяет значительно повысить производительность записи, так как запись данных в буфер быстрее, чем напрямую в файл или другой источник.

Основные методы BufferedWriter:

Конструкторы:

BufferedWriter(Writer out): Создает объект BufferedWriter, связанный с указанным символьным потоком.
BufferedWriter(Writer out, int sz): Создает объект BufferedWriter с указанным размером буфера.


Запись данных:

void write(int c): Записывает один символ в поток.
void write(char[] cbuf, int off, int len): Записывает часть массива символов в поток.
void write(String str): Записывает строку в поток.
void newLine(): Записывает символ новой строки в поток.


Закрытие потока:

void close(): Закрывает поток и освобождает все ресурсы, связанные с ним.

Пример записи в файл с использованием BufferedWriter:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"))) {
writer.write("Hello, World!");
writer.newLine();
writer.write("This is an example of BufferedWriter.");
} catch (IOException e) {
e.printStackTrace();
}
}
}

В этом примере создается объект BufferedWriter, связанный с FileWriter, записывающим в файл example.txt. Затем в файл записывается строка "Hello, World!" и "This is an example of BufferedWriter." с новой строкой между ними.

#Java #Training #IO
👍1
Работа с байтовыми потоками: InputStream, OutputStream

Байтовые потоки в Java используются для чтения и записи данных на уровне байтов. Они идеальны для работы с бинарными данными, такими как изображения, аудио, видео и другие типы файлов, которые не являются текстовыми.

InputStream

InputStream — это абстрактный класс, предназначенный для чтения байтов из различных источников, таких как файлы, массивы байтов, сети и другие.

Основные методы InputStream:

int read(): Читает один байт и возвращает его. Возвращает -1 в случае достижения конца потока.
int read(byte[] b): Читает байты в массив b. Возвращает количество прочитанных байтов или -1, если достигнут конец потока.
int read(byte[] b, int off, int len): Читает до len байтов в массив b, начиная с off. Возвращает количество прочитанных байтов или -1, если достигнут конец потока.
void close(): Закрывает поток и освобождает все связанные с ним ресурсы.


Пример использования FileInputStream для чтения данных из файла:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("example.bin")) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


В этом примере создается FileInputStream для чтения байтов из файла example.bin. Каждый байт читается и выводится на консоль.


OutputStream

OutputStream — это абстрактный класс, предназначенный для записи байтов в различные источники, такие как файлы, массивы байтов, сети и другие.

Основные методы OutputStream:

void write(int b): Записывает один байт.
void write(byte[] b): Записывает все байты из массива b.
void write(byte[] b, int off, int len): Записывает байты из массива b, начиная с off и до len.
void close(): Закрывает поток и освобождает все связанные с ним ресурсы.
void flush(): Очищает буфер, записывая все данные.


Пример использования FileOutputStream для записи данных в файл:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class OutputStreamExample {
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("example.bin")) {
String data = "Hello, World!";
outputStream.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}


В этом примере создается FileOutputStream для записи байтов в файл example.bin. Строка "Hello, World!" конвертируется в массив байтов и записывается в файл.

#Java #Training #IO
Работа с буферизованными байтовыми потоками: BufferedInputStream, BufferedOutputStream

Буферизация является процессом временного хранения данных в памяти перед их чтением или записью. Буферизация повышает производительность операций ввода-вывода, уменьшая количество обращений к физическим устройствам (таким как диски) и сетевым ресурсам.

BufferedInputStream

BufferedInputStream — это класс, который добавляет возможность буферизации к байтовым потокам ввода. Он оборачивает другие байтовые потоки и использует внутренний буфер для чтения данных.

Основные методы BufferedInputStream:


Конструкторы:

BufferedInputStream(InputStream in): Создает буферизованный поток ввода с указанным потоком.
BufferedInputStream(InputStream in, int size): Создает буферизованный поток ввода с указанным размером буфера.
int read(): Читает один байт из буфера. Возвращает -1 в случае достижения конца потока.
int read(byte[] b, int off, int len): Читает до len байтов в массив b, начиная с off. Возвращает количество прочитанных байтов или -1, если достигнут конец потока.
void close(): Закрывает поток и освобождает все связанные с ним ресурсы.


Пример использования BufferedInputStream для чтения данных из файла:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class BufferedInputStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new BufferedInputStream(new FileInputStream("example.bin"))) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


В этом примере создается BufferedInputStream, оборачивающий FileInputStream, для чтения байтов из файла example.bin. Данные читаются из буфера, что повышает производительность.


BufferedOutputStream


BufferedOutputStream — это класс, который добавляет возможность буферизации к байтовым потокам вывода. Он оборачивает другие байтовые потоки и использует внутренний буфер для записи данных.

Основные методы BufferedOutputStream:

Конструкторы:

BufferedOutputStream(OutputStream out): Создает буферизованный поток вывода с указанным потоком.
BufferedOutputStream(OutputStream out, int size): Создает буферизованный поток вывода с указанным размером буфера.
void write(int b): Записывает один байт в буфер.
void write(byte[] b, int off, int len): Записывает байты из массива b, начиная с off и до len.
void flush(): Очищает буфер, записывая все данные.
void close(): Закрывает поток и освобождает все связанные с ним ресурсы.


Пример использования BufferedOutputStream для записи данных в файл:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class BufferedOutputStreamExample {
public static void main(String[] args) {
try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream("example.bin"))) {
String data = "Hello, World!";
outputStream.write(data.getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}

В этом примере создается BufferedOutputStream, оборачивающий FileOutputStream, для записи байтов в файл example.bin. Данные сначала записываются в буфер, а затем буфер очищается методом flush.

#Java #Training #IO
Объектные потоки: ObjectInputStream, ObjectOutputStream

Объектные потоки в Java используются для чтения и записи объектов. Они позволяют сохранить состояние объекта и затем восстановить его, что полезно для хранения данных между запусками программы или передачи объектов между различными компонентами системы.

ObjectOutputStream

ObjectOutputStream — это класс, который используется для записи объектов в поток. Он записывает объекты в виде последовательности байтов, что позволяет сохранять и передавать объекты.

Основные методы ObjectOutputStream:

Конструкторы:
ObjectOutputStream(OutputStream out): Создает объект ObjectOutputStream, связанный с указанным выходным потоком.

Запись объектов:
void writeObject(Object obj): Записывает объект obj в выходной поток. Объект должен реализовывать интерфейс Serializable.

Другие методы
void close(): Закрывает поток и освобождает все связанные с ним ресурсы.
void flush(): Очищает буфер, записывая все данные в выходной поток.


Пример использования ObjectOutputStream для записи объекта в файл:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}

public class ObjectOutputStreamExample {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
}
}

В этом примере создается объект Person и записывается в файл person.ser с помощью ObjectOutputStream.


ObjectInputStream


ObjectInputStream — это класс, который используется для чтения объектов из потока. Он восстанавливает объекты из последовательности байтов, записанных с помощью ObjectOutputStream.

Основные методы ObjectInputStream:

Конструкторы:

ObjectInputStream(InputStream in): Создает объект ObjectInputStream, связанный с указанным входным потоком.

Чтение объектов:

Object readObject(): Читает объект из входного потока. Требуется приведение типа (casting) к нужному классу.

Другие методы:

void close(): Закрывает поток и освобождает все связанные с ним ресурсы.

Пример использования ObjectInputStream для чтения объекта из файла:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStreamExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}

В этом примере объект Person читается из файла person.ser с помощью ObjectInputStream и выводится на консоль.

#Java #Training #IO
Сериализация и десериализация объектов

Сериализация — это процесс преобразования объекта в последовательность байтов, которая может быть сохранена в файл или передана по сети.
Десериализация — это обратный процесс, при котором байты преобразуются обратно в объект. Эти процессы позволяют сохранять состояние объекта и восстанавливать его в любой момент.


Сериализация

Для того чтобы объект можно было сериализовать, его класс должен реализовывать интерфейс Serializable. Этот интерфейс является маркерным, то есть не содержит методов и служит лишь для указания JVM, что объекты этого класса могут быть сериализованы.

Пример класса, реализующего Serializable:
import java.io.Serializable;

class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}

В этом примере класс Person реализует Serializable, что позволяет его объекты сериализовать.


Процесс сериализации:

Создаем объект ObjectOutputStream, связанный с выходным потоком (например, FileOutputStream).
Вызываем метод writeObject(Object obj) для записи объекта в поток.


Пример сериализации:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
}
}



Десериализация

Процесс десериализации включает чтение последовательности байтов и создание из них объекта. Для этого используется класс ObjectInputStream.

Процесс десериализации:


Создаем объект ObjectInputStream, связанный с входным потоком (например, FileInputStream).
Вызываем метод readObject() для чтения объекта из потока. Обязательно выполняем приведение типа (casting) к нужному классу.


Пример десериализации:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializationExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}


serialVersionUID

Каждый сериализуемый класс должен иметь статическое поле serialVersionUID, которое используется для обеспечения совместимости версий класса. Если serialVersionUID у класса изменится, десериализация объектов, сериализованных с предыдущей версией класса, вызовет ошибку.


Пример объявления serialVersionUID:
class Person implements Serializable {
private static final long serialVersionUID = 1L;
// остальные поля и методы
}


Транзиентные поля

Поля, помеченные ключевым словом transient, не будут сериализованы. Это полезно для полей, которые не нужно сохранять, например, паролей или других конфиденциальных данных.


Пример использования transient:
class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private transient String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

@Override
public String toString() {
return "User{username='" + username + "', password='" + password + "'}";
}
}

В этом примере поле password не будет сериализовано.

#Java #Training #IO #Serializable
Обзор IO и NIO в Java

В Java операции ввода-вывода реализуются через два основных пакета: `java.
io` (классический IO) и `java.nio` (New Input/Output, или NIO), с дополнительными улучшениями в NIO.2, представленными в Java 7. Эти API предназначены для работы с файлами, сетевыми соединениями и другими задачами ввода-вывода, но существенно различаются по архитектуре, производительности и управлению ресурсами.


Классический
IO (java.io)

Пакет `java.io`, появившийся в Java 1.0, предоставляет блокирующий подход к операциям ввода-вывода, ориентированный на потоковую обработку данных. Это делает его простым и интуитивно понятным для базовых задач, таких как чтение файлов или работа с консолью, но ограничивает масштабируемость в высоконагруженных приложениях. Он работает в блокирующем режиме: каждая операция, например чтение из файла или сокета, блокирует вызывающий поток до завершения. Это означает, что для обработки множества соединений требуется создание пула потоков, что увеличивает потребление памяти, так как каждый поток в JVM занимает около 1 МБ стека по умолчанию.

Данные обрабатываются как последовательный поток байтов или символов, что не позволяет перемещаться назад или вперед по данным без дополнительного кэширования. Потоки являются однонаправленными, то есть предназначены либо для чтения, либо для записи. С точки зрения памяти, `java.io` использует память кучи JVM. Буферизированные потоки снижают количество системных вызовов за счет внутренних массивов (обычно размером 8192 байт), но увеличивают потребление памяти. Отсутствие поддержки прямой памяти приводит к дополнительным накладным расходам на копирование данных между JVM и операционной системой.

Производительность классического IO ограничена, особенно в сценариях с большим количеством соединений, таких как веб-серверы, из-за необходимости выделять отдельный поток на каждое соединение. Без буферизации каждая операция вызывает системный вызов, что значительно снижает производительность. Классический IO лучше всего подходит для простых задач, таких как чтение конфигурационных файлов, обработка небольших текстовых данных или работа с консолью, где важна простота кода, а производительность не критична.

При работе с символами необходимо явно указывать кодировку (`Charset`), чтобы избежать проблем с некорректным отображением текста. Также важно использовать конструкцию `try-with-resources`, введенную в Java 7, для предотвращения утечек ресурсов, так как потоки требуют явного закрытия. Для обработки множества соединений требуется пул потоков, что усложняет код и увеличивает потребление памяти.

#Java #middle #on_request #IO #NIO
👍3
Основные классы и интерфейсы java.io

- InputStream: Абстрактный класс для чтения байтовых потоков из различных источников, таких как файлы или сокеты.
- OutputStream: Абстрактный класс для записи байтовых потоков.
- FileInputStream: Читает байты из файла, напрямую взаимодействуя с файловой системой.
- FileOutputStream: Записывает байты в файл.
- Reader: Абстрактный класс для чтения символьных потоков с учетом кодировок.
- Writer: Абстрактный класс для записи символьных потоков.
- FileReader: Читает символы из файла, преобразуя байты в символы с учетом кодировки.
- FileWriter: Записывает символы в файл.
- BufferedInputStream: Буферизирует байтовый ввод, снижая количество системных вызовов.
- BufferedOutputStream: Буферизирует байтовый вывод.
- BufferedReader: Буферизирует символьный ввод, поддерживает чтение строк (`readLine()`).
- BufferedWriter: Буферизирует символьный вывод.
- File: Представляет файл или директорию в файловой системе, позволяет проверять существование, создавать или удалять файлы.
- Socket: Реализует клиентские TCP-соединения для сетевого ввода-вывода.
- ServerSocket: Реализует серверные TCP-соединения.
- DataInputStream: Читает примитивные типы данных (int, double и т.д.) из байтового потока.
- DataOutputStream: Записывает примитивные типы данных в байтовый поток.
- ObjectInputStream: Десериализует объекты из потока.
- ObjectOutputStream: Сериализует объекты в поток.


Пример использования
Чтение файла с использованием `BufferedReader`:

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

public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}



#Java #middle #on_request #IO #NIO
👍3