一开始以为输入输出流能相同不用中间值,感觉特爽。
毕老师在视频中演示的是Write线程write一句话,在Read线程中用read(byte[]b)读取到数组中。这是先输出,后读取
在Write线程中输入,在Read线程中直接获取并读- class Read implements Runnable{
- private PipedInputStream pis;
- public Read(PipedInputStream pis){
- this.pis=pis;
- }
- public void run(){
- try{
- byte[]by=new byte[1024];
- int len=pis.read(by);
- String s=new String(by,0,len);
- System.out.println(s);
- }catch(IOException e){
- throw new RuntimeException("读取管道流失败");
- }
- }
- }
- class Write implements Runnable{
- private PipedOutputStream pos;
- public Write(PipedOutputStream pos){
- this.pos=pos;
- }
- public void run(){
- try{
- pos.write("Piped pia pia lai la".getBytes());
- pos.close();
- }catch(IOException e){
- throw new RuntimeException("写入管道流失败");
- }
- }
- }
复制代码 我自己试了一下,可行。我又试验复制文件,先读取,后输出。
(先写流,后读,可以直接read,但是先读,后写,我不知道怎么write了,我是没办法了,只有静态数组和长度)
不知道大家是用声明办法搞定的,求分享!{:soso__12516999552140149459_4:}- import java.io.*;
- class PipedStreamTest{
- public static void main(String[] args){
- try{
- PipedInputStream pis=new PipedInputStream();
- PipedOutputStream pos=new PipedOutputStream();
- pos.connect(pis);
- Thread t1=new Thread(new Rea(pis));
- Thread t2=new Thread(new Wri(pos));
- t1.start();
- t2.start();
- }catch(IOException e){
- throw new RuntimeException("管道流错误!");
- }
- }
- }
- class Rea implements Runnable{
- private PipedInputStream pis;
- private FileInputStream fis;
- static byte[] by=new byte[1024*5];
- static int len;
- public Rea(PipedInputStream pis){
- this.pis=pis;
- }
- public void run(){
- try{
- fis=new FileInputStream("Person.java");
- len=fis.read(by);
- System.out.println("len:"+len);
- pis.read(by,0,len);
- fis.close();
- pis.close();
- }catch(IOException e){
- throw new RuntimeException("管道流读取失败");
- }
- }
- }
- class Wri implements Runnable{
- private PipedOutputStream pos;
- private FileOutputStream fos;
- public Wri(PipedOutputStream pos){
- this.pos=pos;
- }
- public void run(){
- try{
- fos=new FileOutputStream("copy_Person.java");
- System.out.println("Rea.length:"+Rea.by.length+"Rea.len:"+Rea.len);
- fos.write(Rea.by,0,Rea.len);
- fos.flush();
- fos.close();
- pos.close();
- }catch(IOException e){
- throw new RuntimeException("管道输出失败");
- }
- }
- }
复制代码 上面是我写的拷贝一个文件的小程序。就小于5KB的文件来说,可行(因为我数组定义的就是1024*5),因为我没有写循环
我想知道怎么拷贝更大的文件,保持数组大小不变的情况。
循环我自己试了,我的想法是,如果先Read线程开启,读5KB,然后wait(),接着Write开始写,写5KB,wait(),notify() Read线程,如此反复。
理论上我觉得可行,可是挂掉了,报了java.lang.IllegalMonitorStateException。
这个代码我就不粘了,感觉写的太丢人。
求高手帮助,用PipedOutputStream和PipedInputStream写一个复制文件的小程序。
PS:话说,用管道流复制文件是不是很麻烦,很搞笑?
|
|