PipedStream в Java: передача данных между потоками

PipedInputStream, PipedOutputStream – применяется в многопоточной среде. Потоки в слове многопоточной, это не те потоки, которые мы сейчас изучаем (сейчас мы изучаем потоки ввода вывода). Эти же потоки понимайте как куски кода, которые выполняются параллельно. То есть в одном потоке один кусок кода, в другом другой и т.д, но главное все они выполняются параллельно друг другу.

PipedInputStream, PipedOutputStream связывают два потока I/O для для того чтобы они могли обмениваться информацией друг с другом.

Для передачи каких-либо данных между разными потоками лучше всего использовать этот класс.

Хотя потоки мы пока не разбирали, всё равно приведем пример.

Пример программы:

import java.io.*; import java.util.*; class PipedStreamLesson { // Например, есть 2 независимых потока: ThreadA и ThreadB. // Их классы создаются снизу после класса PipedStreamLesson. // Это не те потоки, которые мы сейчас изучаем // (сейчас мы изучаем потоки ввода-вывода). // Эти же потоки понимайте как два куска кода, // которые выполняются параллельно. // То есть содержимое метода run() в ThreadA выполняется // параллельно содержимому run() в ThreadB. public static void main(String[] args) { // Создаем концы канала: выходной и входной. PipedInputStream pis; PipedOutputStream pos; try { // Связываем в единый канал // для передачи данных между ними. pis = new PipedInputStream(); pos = new PipedOutputStream(pis); // Запускаем потоки. // После этого содержимое методов run // в этих классах начнет выполняться параллельно. new ThreadB(pis).start(); new ThreadA(pos).start(); // Также в эти потоки передаем связанные // каналы pis и pos, которые будут // использоваться для пересылки и считывания данных. } catch (Exception ex) { System.out.println(ex.getMessage()); } } } class ThreadA extends Thread { PipedOutputStream pos; ThreadA(PipedOutputStream pos) { this.pos = pos; } @Override public void run() { try { byte[] bytes = new byte[] {‘a’, ‘g’, ‘b’, ‘c’, ‘6’}; for (byte b : bytes) { // Используем переданный в конструктор pos // для передачи массива bytes в ThreadB. pos.write(b); Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); } } } class ThreadB extends Thread { PipedInputStream pis; ThreadB(PipedInputStream pis) { this.pis = pis; } @Override public void run() { try { int b = 0; // pis считывает данные, передаваемые pos // из ThreadA. while ((b = pis.read()) != -1) { System.out.println((char) b); } } catch (Exception e) { e.printStackTrace(); } } }

Вывод:

Как видим данные успешно пересланы в другой поток и выведены им на консоль.

PushbackInputStream в Java

PushbackInputStream в Java: возврат прочитанных байтов в поток. Пример использования unread() для повторного чтения данных с примерами кода.

Time to read: 8

OutputStreamWriter в Java

OutputStreamWriter в Java: мост между символьными и байтовыми потоками. Пример записи текста в файл с конвертацией символов в байты.

Time to read: 8

ObjectStream в Java

Освойте сериализацию объектов в Java с ObjectInputStream/ObjectOutputStream. Практический пример сохранения и восстановления состояния объекта

Time to read: 10