黑马程序员技术交流社区

标题: 关于管道流复制文件 [打印本页]

作者: 崔政    时间: 2012-10-31 21:15
标题: 关于管道流复制文件
一开始以为输入输出流能相同不用中间值,感觉特爽。
毕老师在视频中演示的是Write线程write一句话,在Read线程中用read(byte[]b)读取到数组中。这是先输出,后读取
在Write线程中输入,在Read线程中直接获取并读
  1. class Read implements Runnable{
  2. private PipedInputStream pis;
  3. public Read(PipedInputStream pis){
  4. this.pis=pis;
  5. }
  6. public void run(){
  7. try{
  8. byte[]by=new byte[1024];
  9. int len=pis.read(by);
  10. String s=new String(by,0,len);
  11. System.out.println(s);
  12. }catch(IOException e){
  13. throw new RuntimeException("读取管道流失败");
  14. }
  15. }
  16. }

  17. class Write implements Runnable{
  18. private PipedOutputStream pos;
  19. public Write(PipedOutputStream pos){
  20. this.pos=pos;
  21. }
  22. public void run(){
  23. try{
  24. pos.write("Piped pia pia lai la".getBytes());
  25. pos.close();
  26. }catch(IOException e){
  27. throw new RuntimeException("写入管道流失败");
  28. }
  29. }
  30. }
复制代码
我自己试了一下,可行。我又试验复制文件,先读取,后输出。
(先写流,后读,可以直接read,但是先读,后写,我不知道怎么write了,我是没办法了,只有静态数组和长度)
不知道大家是用声明办法搞定的,求分享!{:soso__12516999552140149459_4:}
  1. import java.io.*;
  2. class PipedStreamTest{
  3. public static void main(String[] args){
  4. try{
  5. PipedInputStream pis=new PipedInputStream();
  6. PipedOutputStream pos=new PipedOutputStream();
  7. pos.connect(pis);
  8. Thread t1=new Thread(new Rea(pis));
  9. Thread t2=new Thread(new Wri(pos));
  10. t1.start();
  11. t2.start();
  12. }catch(IOException e){
  13. throw new RuntimeException("管道流错误!");
  14. }
  15. }
  16. }

  17. class Rea implements Runnable{
  18. private PipedInputStream pis;
  19. private FileInputStream fis;
  20. static byte[] by=new byte[1024*5];
  21. static int len;
  22. public Rea(PipedInputStream pis){
  23. this.pis=pis;
  24. }
  25. public void run(){
  26. try{
  27. fis=new FileInputStream("Person.java");
  28. len=fis.read(by);
  29. System.out.println("len:"+len);
  30. pis.read(by,0,len);
  31. fis.close();
  32. pis.close();

  33. }catch(IOException e){
  34. throw new RuntimeException("管道流读取失败");
  35. }
  36. }
  37. }

  38. class Wri implements Runnable{
  39. private PipedOutputStream pos;
  40. private FileOutputStream fos;
  41. public Wri(PipedOutputStream pos){
  42. this.pos=pos;
  43. }
  44. public void run(){
  45. try{
  46. fos=new FileOutputStream("copy_Person.java");
  47. System.out.println("Rea.length:"+Rea.by.length+"Rea.len:"+Rea.len);
  48. fos.write(Rea.by,0,Rea.len);
  49. fos.flush();
  50. fos.close();
  51. pos.close();

  52. }catch(IOException e){
  53. throw new RuntimeException("管道输出失败");
  54. }
  55. }

  56. }
复制代码
上面是我写的拷贝一个文件的小程序。就小于5KB的文件来说,可行(因为我数组定义的就是1024*5),因为我没有写循环
我想知道怎么拷贝更大的文件,保持数组大小不变的情况。
循环我自己试了,我的想法是,如果先Read线程开启,读5KB,然后wait(),接着Write开始写,写5KB,wait(),notify()  Read线程,如此反复。
理论上我觉得可行,可是挂掉了,报了java.lang.IllegalMonitorStateException。
这个代码我就不粘了,感觉写的太丢人。
求高手帮助,用PipedOutputStream和PipedInputStream写一个复制文件的小程序。

PS:话说,用管道流复制文件是不是很麻烦,很搞笑?






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2