PipedOutputStream is a class in the java.io package used to write data to a communication pipe, where another thread can read the data using a connected PipedInputStream. Together, they form a producer-consumer style inter-thread communication channel.
This mechanism is helpful for simulating streaming, pipelines, or in-memory communication between threads without using shared memory or files.
Commonly Used Constructors and Methods


Simple Program – Inter-thread Communication
Mahesh writes data into a PipedOutputStream, and LotusJavaPrince reads it using PipedInputStream. This program demonstrates the basic usage of piped streams for communication between two threads.
import java.io.*;
public class SimplePipedStreamDemo {
public static void main(String[] args) throws IOException {
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(pout);
Thread writer = new Thread(() -> {
try {
pout.write("Hello from Mahesh!".getBytes());
pout.close();
} catch (IOException e) {
e.printStackTrace();
}
});
Thread reader = new Thread(() -> {
try {
int data;
while ((data = pin.read()) != -1) {
System.out.print((char) data);
}
pin.close();
} catch (IOException e) {
e.printStackTrace();
}
});
writer.start();
reader.start();
}
}
/*
Hello from Mahesh!
*/Problem Statement:
LotusJavaPrince wants to create a simulation where Mahesh sends messages to him via a PipedOutputStream, and LotusJavaPrince receives them using a PipedInputStream. This program emulates a one-way chat between two threads.
import java.io.*;
class MaheshSender extends Thread {
private final PipedOutputStream out;
public MaheshSender(PipedOutputStream out) {
this.out = out;
}
public void run() {
String[] messages = {
"Mahesh: Hi LotusJavaPrince!",
"Mahesh: Are you ready for the Java exam?",
"Mahesh: Let's meet at the library later."
};
try {
for (String msg : messages) {
out.write((msg + "\n").getBytes());
Thread.sleep(1000);
}
out.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
class LotusJavaPrinceReceiver extends Thread {
private final PipedInputStream in;
public LotusJavaPrinceReceiver(PipedInputStream in) {
this.in = in;
}
public void run() {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("LotusJavaPrince received: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class PipedChatSimulator {
public static void main(String[] args) throws IOException {
PipedOutputStream output = new PipedOutputStream();
PipedInputStream input = new PipedInputStream(output);
new MaheshSender(output).start();
new LotusJavaPrinceReceiver(input).start();
}
}Output
LotusJavaPrince received: Mahesh: Hi LotusJavaPrince!
LotusJavaPrince received: Mahesh: Are you ready for the Java exam?
LotusJavaPrince received: Mahesh: Let's meet at the library later.
PipedOutputStream is not as commonly used as file streams or socket streams, but in scenarios where memory-based, real-time, thread-to-thread communication is required, it becomes an elegant and efficient solution.
