博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入"java基础课程",即可免费获得全套架构师全套课程
一、java.io
1.57 PipedInputStream
PipedInputStream
类是 Java I/O 包中的一个类,它表示从管道中读取数据的输入流。管道输入流必须与管道输出流一起使用,以便将数据从一个线程传输到另一个线程。以下是关于 PipedInputStream
的详细介绍:
PipedInputStream 类介绍:
构造方法:
-
PipedInputStream()
: 创建一个未连接的管道输入流。 -
PipedInputStream(PipedOutputStream src)
: 创建一个连接到指定管道输出流的管道输入流。
方法摘要:
-
void connect(PipedOutputStream src) throws IOException
: 将管道输入流连接到指定的管道输出流。 -
int read() throws IOException
: 从管道中读取下一个字节的数据。 -
int read(byte[] b, int off, int len) throws IOException
: 从管道中读取数据到指定的字节数组中。
简单使用例子:
以下是一个简单的例子,演示了如何使用 PipedInputStream
和 PipedOutputStream
来实现线程间的通信:
javaCopy code
import java.io.*;
public class PipeExample {
public static void main(String[] args) {
try {
// 创建管道输入流和管道输出流
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
// 将管道输入流连接到管道输出流
pipedInputStream.connect(pipedOutputStream);
// 创建并启动写入线程
Thread writerThread = new Thread(() -> {
try {
String message = "Hello, Pipe!";
pipedOutputStream.write(message.getBytes());
pipedOutputStream.close(); // 发送完毕后关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
});
writerThread.start();
// 读取管道中的数据
int data;
while ((data = pipedInputStream.read()) != -1) {
System.out.print((char) data);
}
// 关闭输入流
pipedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们创建了一个管道输入流和一个管道输出流,并将它们连接起来。然后,我们创建了一个写入线程,它向管道输出流中写入数据。主线程通过管道输入流读取数据,并将其打印到控制台上。
应用场景
PipedInputStream
主要用于实现线程之间的通信,通常与 PipedOutputStream
一起使用。以下是一些常见的应用场景及相应的代码实现:
- 线程间通信 :
PipedInputStream
和PipedOutputStream
可以用于在不同线程之间传输数据,例如在生产者-消费者模式中。
javaCopy code
public class PipeExample {
public static void main(String[] args) {
try {
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
pipedInputStream.connect(pipedOutputStream);
Thread producerThread = new Thread(() -> {
try {
for (int i = 1; i <= 5; i++) {
pipedOutputStream.write(i);
Thread.sleep(1000);
}
pipedOutputStream.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
});
Thread consumerThread = new Thread(() -> {
try {
int data;
while ((data = pipedInputStream.read()) != -1) {
System.out.println("Received: " + data);
}
pipedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
});
producerThread.start();
consumerThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.数据处理管道:可以使用管道流来创建数据处理管道,其中一个线程读取数据,另一个线程对数据进行处理。
javaCopy code
public class DataProcessingPipeline {
public static void main(String[] args) {
try {
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
pipedInputStream.connect(pipedOutputStream);
Thread dataProducerThread = new Thread(() -> {
try {
String data = "Data to be processed";
pipedOutputStream.write(data.getBytes());
pipedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
});
Thread dataProcessorThread = new Thread(() -> {
try {
StringBuilder stringBuilder = new StringBuilder();
int data;
while ((data = pipedInputStream.read()) != -1) {
stringBuilder.append((char) data);
}
System.out.println("Processed Data: " + stringBuilder.toString());
pipedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
});
dataProducerThread.start();
dataProcessorThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是两个使用 PipedInputStream
的应用场景及相应的代码实现。这些例子展示了如何使用 PipedInputStream
来实现线程之间的数据传输。
实战例子
下面是一个简单的项目实战例子,演示了如何使用 PipedInputStream
和 PipedOutputStream
实现一个简单的消息传递系统。在这个例子中,有一个生产者线程负责生成消息,将消息通过管道输出流发送给消费者线程,消费者线程从管道输入流接收消息并处理。
javaCopy code
import java.io.*;
public class MessagingSystem {
public static void main(String[] args) {
try {
// 创建管道输入流和管道输出流
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
// 将管道输入流连接到管道输出流
pipedInputStream.connect(pipedOutputStream);
// 创建并启动生产者线程
Thread producerThread = new Thread(() -> {
try {
// 生产消息
String message = "Hello from Producer!";
// 发送消息到管道输出流
pipedOutputStream.write(message.getBytes());
pipedOutputStream.close(); // 发送完毕后关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
});
producerThread.start();
// 创建并启动消费者线程
Thread consumerThread = new Thread(() -> {
try {
// 读取管道中的数据
int data;
StringBuilder receivedMessage = new StringBuilder();
while ((data = pipedInputStream.read()) != -1) {
receivedMessage.append((char) data);
}
// 处理接收到的消息
System.out.println("Received message: " + receivedMessage.toString());
// 关闭输入流
pipedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
});
consumerThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,生产者线程生成一条消息并将其发送到管道输出流。消费者线程从管道输入流读取消息并进行处理。通过使用 PipedInputStream
和 PipedOutputStream
,我们可以实现线程之间的简单消息传递。