Java I/O流之管道流-多线程实现

输出管道对象调用write()成员函数输出数据(即向管道的输入端发送数据)

输入管道对象调用read()成员函数可以赌气数据(即向管道的输入端获取数据)

1.1 线程继承实现 extends thread

package org.io;

import java.io.*;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * 管道流
 * @author 我的账号
 * 输出管道对象调用write()成员函数输出数据(即向管道的输入端发送数据)
 * 输入管道对象调用read()成员函数可以赌气数据(即向管道的输入端获取数据)
 */
public class PipeStream {
	public static void main(String[] args) {
		try {
			
			//构造读写的管道流对象
			PipedInputStream pis = new PipedInputStream();
			PipedOutputStream pos = new PipedOutputStream();
			
			//实现关联
			pos.connect(pis);
			
			//构造两个线程,并且启动
			new Sender(pos, "D:\\text2.txt").start();
			new Receiver(pis, "d:\\text3.txt").start();
			
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
	
	
}

//sender  线程
class Sender extends Thread{
	PipedOutputStream pos;
	File file;
	
	//构造方法
	Sender(PipedOutputStream pos,String fileName){
		this.pos = pos;
		file = new File(fileName);
	}
	
	char ch;
	//线程运行方法
	public void run(){
		try {
			//读文件内容
			FileInputStream fs = new FileInputStream(file);
			int data;
			while((data = fs.read()) != -1){
				//写入管道始端
				pos.write(data);
			}
			pos.close();
		} catch (Exception e) {
			System.out.println("send error" + e);
		}
		
	}
}

//receiver 线程
class Receiver extends Thread{
	PipedInputStream pis;
	File file;
	
	//构造方法
	Receiver(PipedInputStream pis,String filename){
		this.pis = pis;
		file = new File(filename);
	}
	
	//线程运行
	public void run(){
		try {
			//写文件流对象
			FileOutputStream fos = new FileOutputStream(file);	
			int data;
			
			//从管道末端读
			while((data = pis.read()) != -1){
				//写入本地文件
				fos.write(data);
				
			}
		} catch (Exception e) {
			System.out.println("receiver Error"+e);
		}
	}
}

1.2 实现线程 implements runnable

package org.io;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * 管道流
 * @author 我的账号
 *
 */
public class PipeStream2 {
	public static void main(String[] args) throws Exception{
		PipedInputStream pis = new PipedInputStream();
		PipedOutputStream pos = new PipedOutputStream();
		
		//将两个管道流链接起来
		pis.connect(pos);
		
		//多线程交互使用
		new Thread(new Input(pis)).start();
		new Thread(new output(pos)).start();
	}
}

//输入部分
class Input implements Runnable{
	private PipedInputStream in;
	
	public Input(PipedInputStream in){
		super();
		this.in = in;
	}
	
	@Override
	public void run() {
		byte[] buf = new byte[1024];
		int len;
		try{
			len = in.read(buf);
			String s = new String(buf,0,len);
			System.out.println("输出管道数据: "+s);
			in.close();
		}catch(IOException e){
			e.printStackTrace();
			
		}
		
	}
	
}

//输出部分
class output implements Runnable{
	private PipedOutputStream out;
	public output(PipedOutputStream out){
		super();
		this.out = out;
	}
	
	@Override
	public void run() {
		try {
			out.write("源管道流".getBytes());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值