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

Раздел: Потоки ввода/вывода

Раздел о том, как работать с файлами и потоками в Java: чтение, запись, буферизация и сериализация данных.

Все разделы
Иконка Потоки ввода/вывода

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
мин.

Similar Articles Icon
Divider

OutputStreamWriter в Java

8
мин.

Similar Articles Icon
Divider

ObjectStream в Java

10
мин.

Similar Articles Icon