黑马程序员技术交流社区
标题:
关于管道流复制文件
[打印本页]
作者:
崔政
时间:
2012-10-31 21:15
标题:
关于管道流复制文件
一开始以为输入输出流能相同不用中间值,感觉特爽。
毕老师在视频中演示的是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:话说,用管道流复制文件是不是很麻烦,很搞笑?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2