I/O复习 二 (过滤字节流 FileteInputStream/FilterOutputStream)

 java.io包中提供了FilterInputStream和FilterOutputStream类分别对其他输入输出流进行特殊的处理,它们在
  * 读/写数据的同时还能够对数据进行特殊的处理。另外它们还提供了同步机制,是的某一时刻之后一个线程可以访问输入/输出流。
  * FilterInputStream/FilterOutputStream都是抽象类。
  * FilterInputStream有三个子类:BufferedInputStream、DataInputStream、PushbackInputStream
  * FilterOutputStream也有三个子类:BufferedOutputStream、DataOutoutStream、PrintStream
  *
  * 使用过滤字节流的时候,必须先制定节点流对象处理底层的数据,然后把节点流对象作为过滤流对象的实参使用。即把过滤流对象连接到某个输入/输出节点流对象上如下:
  * FileInputStream fis = new FileInputStream(new File("c:/abc.txt"));
  * DataInputSream dis = new DataInputStream(fis);

一、BufferedInputStream/BufferedOutputStream


  * BufferedInputStream/BufferedOutputStream 是缓冲字节流,它引入了针对内存缓冲区的操作,从而提高了读写数据的效率。
  * 缓冲区的默认大小为32字节,也可以指定缓冲区的大小。
  * 相应的构造的方法
  * BufferedInputStream(InputStream in) 这里的in只要是继承自InputSream的对象都可以作为参数
  * BufferedInputStream(InputStream in,int size)
  * BufferedOutputStream与上面的对应。

Demo:使用BufferedInputStream/BufferdeOutputStream完成文件的复制。

 1 package com.tai.io;
 2 
 3 import java.io.BufferedInputStream;
 4 import java.io.BufferedOutputStream;
 5 import java.io.File;
 6 import java.io.FileInputStream;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 
10 public class BufferedInputStreamDemo
11 {
12     /**
13      * java.io包中提供了FilterInputStream和FilterOutputStream类分别对其他输入输出流进行特殊的处理,它们在
14      * 读/写数据的同时还能够对数据进行特殊的处理。另外它们还提供了同步机制,是的某一时刻之后一个线程可以访问输入/输出流。
15      * FilterInputStream/FilterOutputStream都是抽象类。
16      * FilterInputStream有三个子类:BufferedInputStream、DataInputStream、PushbackInputStream
17      * FilterOutputStream也有三个子类:BufferedOutputStream、DataOutoutStream、PrintStream
18      * 
19      * 使用过滤字节流的时候,必须先制定节点流对象处理底层的数据,然后把节点流对象作为过滤流对象的实参使用。即把过滤流对象连接到某个输入/输出节点流对象上
20      * 
21      * FileInputStream fis = new FileInputStream(new File("c:/abc.txt"));
22      * DataInputSream dis = new DataInputStream(fis);
23      * BufferedInputStream/BufferedOutputStream 是缓冲字节流,它引入了针对内存缓冲区的操作,从而提高了读写数据的效率。
24      * 缓冲区的默认大小为32字节,也可以指定缓冲区的大小。
25      * 相应的构造的方法
26      * BufferedInputStream(InputStream in) 这里的in只要是继承自InputSream的对象都可以作为参数
27      * BufferedInputStream(InputStream in,int size)
28      * BufferedOutputStream与上面的对应。
29      */
30     public static void main(String[] args) throws IOException
31     {
32         FileInputStream fis = new FileInputStream(new File("c:/曲婉婷 - 没有什么不同 [mqms].mp3"));
33         BufferedInputStream bis = new BufferedInputStream(fis,1024);
34         FileOutputStream fos = new FileOutputStream(new File("c:/没有什么不同.mp3"));
35         BufferedOutputStream bos = new BufferedOutputStream(fos,1024);
36         
37         byte[] buffer = new byte[1024];
38         int len =0;
39         while(-1!=(len=bis.read(buffer,0,1024)))
40         {
41             //将buffer中从fis读取来的数据写入到bos中
42             bos.write(buffer,0,len);
43         }
44         bos.flush();//最近一次读取的数据可能达不到1024字节,这里强制清空缓冲区
45         System.out.println("已经将c:/曲婉婷 - 没有什么不同 [mqms].mp3复制到c:/没有什么不同.mp3");
46         bos.close();
47         fos.close();
48     }
49 }
BufferedInputStrean文件复制

运行结果:

已经将c:/曲婉婷 - 没有什么不同 [mqms].mp3复制到c:/没有什么不同.mp3

二、DataInputStream和DataOutputStream

 * java.io包中还有连个接口DataInput和DataOutput,这两个接口设计了较高级的数据输入输出方式,除了可以处理字节个字节数组外
  * 还可以处理  int、float、boolean等基本的数据类型,这些数据在文件中的表示方式和它们在内存中的方式一样,无序转换,它们相应的提供了
  * 很多处理基本数据类型的方法,如:DataInput提供了read()、readInt()、readByte()等DataOutput提供了write()、writeInt()、
  * writeFloat()、writeChar()等 ....
  *
  * 而数据流类 DataInputStream和DataOutputStream分别实现了DataInput和DataOutput接口。它们以统一的方式向输入流中写入boolean、int、long
  * double等基本的数据类型,并且还可以把基本的数据类型取出来,同时它们也有针对字符串的读写方法

Demo:

 1 package com.tai.io;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.File;
 6 import java.io.FileInputStream;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 import java.util.Scanner;
10 
11 public class DataInputStreamDemo
12 {
13     /**
14      * java.io包中还有连个接口DataInput和DataOutput,这两个接口设计了较高级的数据输入输出方式,除了可以处理字节个字节数组外
15      * 还可以处理  int、float、boolean等基本的数据类型,这些数据在文件中的表示方式和它们在内存中的方式一样,无序转换,它们相应的提供了
16      * 很多处理基本数据类型的方法,如:DataInput提供了read()、readInt()、readByte()等DataOutput提供了write()、writeInt()、
17      * writeFloat()、writeChar()等 ....
18      * 
19      * 而数据流类 DataInputStream和DataOutputStream分别实现了DataInput和DataOutput接口。它们以统一的方式向输入流中写入boolean、int、long
20      * double等基本的数据类型,并且还可以把基本的数据类型取出来,同时它们也有针对字符串的读写方法
21      * @throws IOException 
22      */
23     public static void main(String[] args) throws IOException
24     {
25         FileOutputStream fos = new FileOutputStream(new File("C:/abc/a.txt"));
26         DataOutputStream dos = new DataOutputStream(fos);
27         Scanner scan = new Scanner(System.in);
28         System.out.println("请输入数据: ");
29         
30         dos.writeBoolean(scan.nextBoolean());
31         dos.writeByte(scan.nextInt());
32         dos.writeFloat(scan.nextFloat());
33         dos.writeShort(scan.nextInt());
34         dos.writeChar('A');
35         dos.close();
36         
37         FileInputStream fis = new FileInputStream(new File("C:/abc/a.txt"));
38         DataInputStream dis = new DataInputStream(fis);
39         System.out.println("读取Boolean数据 	" + dis.readBoolean());
40         System.out.println("读取Byte数据 	" + dis.readByte());
41         System.out.println("读取Float数据 	" + dis.readFloat());
42         System.out.println("读取Short数据 	" + dis.readShort());
43         System.out.println("读取Char数据 	" + dis.readChar());
44         dis.close();
45         
46     }
47 }
DataInputStream

运行结果:
  

请输入数据: 
true
65
63.25
56
读取Boolean数据     true
读取Byte数据     65
读取Float数据     63.25
读取Short数据     56
读取Char数据     A

三、管道字节流


 * 管道用来把程序、线程或程序块的输出连接到另一个程序、线程或者程序块作为它的输入。
 * java.io提供了类PipedInputSteramh和PipedOutputStream 作为管道的输入/输出流。
 * 管道输入流作为一个通信管道接收端,管道输出流作为发送端。管道流必须是输入流输出流同时并用,即在使用管道前,两者必须进行连接。
 * 无论PipedInputStream还是PipdeOutputStream类都提供了connect()方法可以使用connect()方法建立一个管道进行数据传输。
 * 管道输入/输出流可以用两种方式进行连接,一种方式是使用connect()方法:
 *   PipedInputStream pis  = new PipedInputStream();
 *  PipedOutputStream pos = new PipedOutputStream();
 *  pis.connect(pos);
 *  pos.connect(pis);
 *  另外一种是直接使用构造方法进行连接:
 *  PipedInputStream pis = new PipedInputStream();
 *  PipedOutputStream pos = new PipedOutputStream(pis);
 *   
 *  除了connect()方法PipedInputStream类还继承了InputStream类的read()方法。另外又增加了receive()方法
 *  PipedOutputStream类也继承自OutputStream类的write()方法。

Demo1:

 1 package com.tai.io;
 2 
 3 import java.io.IOException;
 4 import java.io.PipedInputStream;
 5 import java.io.PipedOutputStream;
 6 
 7 public class PipedStreamDemo
 8 {
 9 /**
10  * 管道字节流
11  * 管道用来把程序、线程或程序块的输出连接到另一个程序、线程或者程序块作为它的输入。
12  * java.io提供了类PipedInputSteramh和PipedOutputStream 作为管道的输入/输出流。
13  * 管道输入流作为一个通信管道接收端,管道输出流作为发送端。管道流必须是输入流输出流同时并用,即在使用管道前,两者必须进行连接。
14  * 无论PipedInputStream还是PipdeOutputStream类都提供了connect()方法可以使用connect()方法建立一个管道进行数据传输。
15  * 管道输入/输出流可以用两种方式进行连接,一种方式是使用connect()方法:
16  *         PipedInputStream pis  = new PipedInputStream();
17  *        PipedOutputStream pos = new PipedOutputStream();
18  *        pis.connect(pos);
19  *        pos.connect(pis);
20  *        另外一种是直接使用构造方法进行连接:
21  *        PipedInputStream pis = new PipedInputStream();
22  *        PipedOutputStream pos = new PipedOutputStream(pis);
23  *         
24  *     除了connect()方法PipedInputStream类还继承了InputStream类的read()方法。另外又增加了receive()方法
25  *     PipedOutputStream类也继承自OutputStream类的write()方法。    
26  * @throws IOException 
27  */
28     
29     public static void main(String[] args) throws IOException
30     {
31         int ch1 = 0;
32         PipedInputStream pis = new PipedInputStream();
33         PipedOutputStream pos = new PipedOutputStream(pis);
34         //也可以使用connect()方法
35          //    PipedOutputStream pos = new PipedOutputStream();
36          //        pos.connect(pis);
37         System.out.println("请输入一个字符,按#结束程序!");
38         while((ch1 = System.in.read())!='#')
39         {
40             pos.write(ch1);
41             System.out.println((char)pis.read());
42         }
43     }
44 }
PipedInputStramDemo

运行结果:

请输入一个字符,按#结束程序!
A
A

A
A

c
c

#

PipedInputStream 和PipedOutStream常与线程连用,已达到在不同线程间的通讯:

Demo2:

 1 package com.tai.io;
 2 
 3 import java.io.IOException;
 4 import java.io.PipedInputStream;
 5 import java.io.PipedOutputStream;
 6 
 7 public class PipedStreamDemo2
 8 {
 9     public static void main(String[] args) throws IOException
10     {
11         PipedInputStream pis = new PipedInputStream();
12         //实例管道输出流并与上面的管道输入流连接
13         PipedOutputStream pos = new PipedOutputStream(pis);
14         
15         new Thread(new InputThread(pis)).start();
16         new Thread(new OutputThread(pos)).start();
17     }
18 }
19 
20 class InputThread implements Runnable
21 {
22 
23     private PipedInputStream pis;
24     public InputThread(PipedInputStream in)
25     {
26         this.pis = in;
27     }
28     
29     @Override
30     public void run()
31     {
32         byte[] buffer = new byte[1024];
33         int len = 0;
34         try
35         {
36             len = pis.read(buffer);
37             
38             String str = new String(buffer,0,len);
39             
40             System.out.println("管道输入流作为接收端,接受来自管道输出流发送的内容。  内容是:    "+ str);
41             pis.close();
42         }
43         catch (IOException e)
44         {
45             e.printStackTrace();
46         }
47         
48     }
49 }
50 
51 class OutputThread implements Runnable
52 {
53     private PipedOutputStream pos;
54     public OutputThread (PipedOutputStream out)
55     {
56         this.pos = out;
57     }
58     @Override
59     public void run()
60     {
61         try
62         {
63             pos.write("管道输出流作为发送端向管道输入流发送内容".getBytes());
64             pos.close();
65         }
66         catch (IOException e)
67         {
68             e.printStackTrace();
69         }
70     }
71     
72 }
Thread PipedInoputStream

运行结果:

管道输入流作为接收端,接受来自管道输出流发送的内容。  内容是:    管道输出流作为发送端向管道输入流发送内容
原文地址:https://www.cnblogs.com/mauiie/p/tai_io_FilterInputStream.html