The PipedReader class in Java belongs to the java.io package and is used for inter-thread communication. It allows one thread to read character data that another thread has written using a PipedWriter.
Commonly Used Constructors and Methods

Simple Program using PipedReader and PipedWriter
LotusJavaPrince has a system where one thread processes transactions and another logs them to audit. Mahesh writes the transaction strings using PipedWriter, while the logger thread reads them via PipedReader for real-time logging.
import java.io.*;
class TransactionLogger implements Runnable {
private PipedReader reader;
public TransactionLogger(PipedReader reader) {
this.reader = reader;
}
public void run() {
try {
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println("Audit Log: " + line);
}
} catch (IOException e) {
System.out.println("Error in logger: " + e.getMessage());
}
}
}
class TransactionProcessor implements Runnable {
private PipedWriter writer;
public TransactionProcessor(PipedWriter writer) {
this.writer = writer;
}
public void run() {
try {
PrintWriter pw = new PrintWriter(writer);
pw.println("TXN001: $1000 approved");
pw.println("TXN002: $500 declined");
pw.println("TXN003: $750 approved");
pw.close();
} catch (Exception e) {
System.out.println("Error in processor: " + e.getMessage());
}
}
}
public class CaseStudyPipedReader {
public static void main(String[] args) throws IOException {
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader(writer);
Thread processor = new Thread(new TransactionProcessor(writer));
Thread logger = new Thread(new TransactionLogger(reader));
logger.start();
processor.start();
}
}Output
Audit Log: TXN001: $1000 approved
Audit Log: TXN002: $500 declined
Audit Log: TXN003: $750 approved
PipedReader is useful for inter-thread communication using characters.
- It must be connected to a
PipedWriter. - Ideal for decoupling producers and consumers in multi-threaded apps.
- Always handle synchronization and close streams properly to avoid
IOException.
