Java I/O流 - 管道流

2021/4/8 1:08:28

本文主要是介绍Java I/O流 - 管道流,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java I/O流 - 管道流

​ ​ ​ ​ ​ ​ ​ 管道流主要用来实现线程之间的通信。在使用管道流的时候,输入流和输出流需要并用,即在使用管理流时两者必须进行连接。通常,由某个线程将数据写入到相应的 PipedOutputStream 中,其他线程从 PipedInputStream 中读取数据。

PipedStream 实现线程传输数据示意(PipedStreamTest)

功能描述:定义一个接受方 Sender 和 发送方 Receiver,然后通过建立好的管道实现线程之间的通信

// 发送端线程
class Sender implements Runnable {
    private PipedOutputStream output = null; // 用来连接发送端的管道

    public Sender(PipedOutputStream output) {
        this.output = output; // 连接发送管道
    }

    @Override
    public void run() {
        String content = "我是要传送的内容"; // 传输的数据

        try {
            output.write(content.getBytes()); // 将数据写入发送端
            output.close(); // 关闭管道输出流
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("发送方发送信息完成!");
    }
}

// 接收方线程
class Receiver implements Runnable {
    private PipedInputStream input = new PipedInputStream(); // 用来连接接受端的管道

    public PipedInputStream getInput() {
        return input; // 传递输入管道给发送方连接
    }

    @Override
    public void run() {
    	byte[] bytes = new byte[1024];
        try {
            int nums = input.read(bytes); // 取得输入端输入的信息
            input.close(); // 关闭输入管道流
            if (nums == -1) {
                System.out.println("接受端接收的内容为空!");
            } else {
                System.out.println("接受端接收的内容为: " + new String(bytes, 0, nums) + "!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class PipedStreamTest {
    public static void main(String[] args) throws IOException {
		// 建立管道的输入与输出流
        PipedInputStream input = new PipedInputStream();
        PipedOutputStream output = new PipedOutputStream();

       	// 建立输出端和接收端的线程
        Sender sender = new Sender(output); // 将输出管道连通发送方的输出流
        Receiver receiver = new Receiver();
        input = receiver.getInput(); // 将输入管道连通接受方的输入流

		// 连接输入输出管道
        output.connect(input);

		// 运行输入输出端
        new Thread(sender).start();
        new Thread(receiver).start();
    }
}

小结:

  • 管道流传递数据的是字节流

  • 管道流就像一条线一样,将两个无关的线程连接起来,使双方可以输送数据

  • 无论 CUP 如何调度,连接了输入输出管道的线程,

    一定是发送方线程先完成后,接受方线程才能开始运行



这篇关于Java I/O流 - 管道流的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程