📄 readwrite.java
字号:
//本程序中往管道字节输出流中写入的字节是随机产生的,什么时候写入结束也是由程序随机决定
import java.io.*;
public class ReadWrite //主程序类
{
public static void main(String args[]) throws IOException
{
Pipe p = new Pipe(); //先建一个管道
reader r = new reader(p); //分别建立读者和写者,并连到管道
writer w = new writer(p);
r.start(); //开启线程
w.start();
}
}
class Pipe //管道类
{
boolean readOver = false; //记录管道字节输入流是否结束,结束的话将其置为true
boolean writeOver = false; //记录管道字节输出流是否结束,结束的话将其置为true
private PipedOutputStream pw; //管道字节输出流
private PipedInputStream pr; //管道字节输入流
private int num = 0; //用来记录当前管道字节流中有多少可读的字节
public Pipe() throws IOException
{
pw = new PipedOutputStream();
pr = new PipedInputStream(pw); //初始化,将管道字节输入流连接到管道字节输出流
}
public synchronized void writePipe() throws IOException //往管道字节输出流里写数据
{
if(Math.random()>0.25) //随机决定管道字节输入流是否结束
{
int c = (int)(Math.random()*100);
pw.write(c); //往管道字节输入流随机写入一个字节(只有一字节被写入)
System.out.println("writer write:\t"+(char)c);
}
else
{
pw.write('.');
writeOver = true; //输出流结束
System.out.println("writer write:\t"+".");
System.out.println("Write Over!");
}
num++; //管道字节流中可读的字节增加一
notify(); //唤醒读进程
}
public synchronized void readPipe() throws IOException //从管道字节输入流里读数据
{
if(num==0) //无字节可读
{
try
{
System.out.println("reader waiting...");
wait(); //无可读字节,等待
}
catch(InterruptedException e){};
}
int c;
if((c=pr.read())!='.')
System.out.println("reader read:\t"+(char)c); //管道字节输入流没有结束,输出读入的字节
else
{
readOver = true;
System.out.println("reader read:\t"+(char)c); //管道字节输入流结束,输出结束符'.'
System.out.println("Read Over!");
}
num--; //管道字节流中可读的字节减少一
}
}
class reader implements Runnable //读者类
{
private Pipe p; //与读者相关的管道
Thread readerIns;
public void start()
{
if(readerIns==null)
{
readerIns=new Thread(this,"Reader");
readerIns.start();
}
}
public reader(Pipe p)
{
this.p = p;
}
public void run()
{
try
{
while(p.readOver==false) //读入字节直到管道字节输入流结束
p.readPipe();
}
catch(IOException e){}
}
}
class writer implements Runnable //写者类
{
private Pipe p; //与写者相关的管道
Thread writeIns;
public void start()
{
if(writeIns==null)
{
writeIns=new Thread(this,"Writer");
writeIns.start();
}
}
public writer(Pipe p)
{
this.p = p;
}
public void run()
{
try
{
while(p.writeOver==false) //写入字节直到管道字节输出流结束
p.writePipe();
}
catch(IOException e){}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -