PipedStream в Java: передача данных между потоками
Last updated: 6 мая 2025 г.PipedInputStream
, PipedOutputStream
– применяется в многопоточной среде. Потоки в слове многопоточной, это не те потоки, которые мы сейчас изучаем (сейчас мы изучаем потоки ввода вывода). Эти же потоки понимайте как куски кода, которые выполняются параллельно. То есть в одном потоке один кусок кода, в другом другой и т.д, но главное все они выполняются параллельно друг другу.
PipedInputStream, PipedOutputStream связывают два потока I/O для для того чтобы они могли обмениваться информацией друг с другом.
Для передачи каких-либо данных между разными потоками лучше всего использовать этот класс.
Хотя потоки мы пока не разбирали, всё равно приведем пример.
Пример программы:
1import java.io.*;
2import java.util.*;
3
4class PipedStreamLesson {
5 // Например, есть 2 независимых потока: ThreadA и ThreadB.
6 // Их классы создаются снизу после класса PipedStreamLesson.
7 // Это не те потоки, которые мы сейчас изучаем
8 // (сейчас мы изучаем потоки ввода-вывода).
9 // Эти же потоки понимайте как два куска кода,
10 // которые выполняются параллельно.
11 // То есть содержимое метода run() в ThreadA выполняется
12 // параллельно содержимому run() в ThreadB.
13
14 public static void main(String[] args) {
15 // Создаем концы канала: выходной и входной.
16 PipedInputStream pis;
17 PipedOutputStream pos;
18
19 try {
20 // Связываем в единый канал
21 // для передачи данных между ними.
22 pis = new PipedInputStream();
23 pos = new PipedOutputStream(pis);
24
25 // Запускаем потоки.
26 // После этого содержимое методов run
27 // в этих классах начнет выполняться параллельно.
28 new ThreadB(pis).start();
29 new ThreadA(pos).start();
30
31 // Также в эти потоки передаем связанные
32 // каналы pis и pos, которые будут
33 // использоваться для пересылки и считывания данных.
34 } catch (Exception ex) {
35 System.out.println(ex.getMessage());
36 }
37 }
38}
39
40class ThreadA extends Thread {
41 PipedOutputStream pos;
42
43 ThreadA(PipedOutputStream pos) {
44 this.pos = pos;
45 }
46
47 @Override
48 public void run() {
49 try {
50 byte[] bytes = new byte[] {‘a’, ‘g’, ‘b’, ‘c’, ‘6’};
51
52 for (byte b : bytes) {
53 // Используем переданный в конструктор pos
54 // для передачи массива bytes в ThreadB.
55 pos.write(b);
56 Thread.sleep(1000);
57 }
58 } catch (Exception e) {
59 e.printStackTrace();
60 }
61 }
62}
63
64class ThreadB extends Thread {
65 PipedInputStream pis;
66
67 ThreadB(PipedInputStream pis) {
68 this.pis = pis;
69 }
70
71 @Override
72 public void run() {
73 try {
74 int b = 0;
75
76 // pis считывает данные, передаваемые pos
77 // из ThreadA.
78 while ((b = pis.read()) != -1) {
79 System.out.println((char) b);
80 }
81 } catch (Exception e) {
82 e.printStackTrace();
83 }
84 }
85}
Вывод:

Как видим данные успешно пересланы в другой поток и выведены им на консоль.
Следующие уроки
PushbackInputStream в Java
8
мин.
OutputStreamWriter в Java
8
мин.
ObjectStream в Java
10
мин.