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 }
运行结果:
已经将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 }
运行结果:
请输入数据: 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 }
运行结果:
请输入一个字符,按#结束程序!
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 }
运行结果:
管道输入流作为接收端,接受来自管道输出流发送的内容。 内容是: 管道输出流作为发送端向管道输入流发送内容