• 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

    运行结果:

    管道输入流作为接收端,接受来自管道输出流发送的内容。  内容是:    管道输出流作为发送端向管道输入流发送内容
  • 相关阅读:
    坚持
    随笔
    C++:对象和类
    STEP7 V14 安装和激活
    c++:cout
    C 格式化字符串处理函数
    WIn:消极处理机制
    Python:requests发送json格式数据
    Python:logging日志功能的基本使用
    PLC:西门子测试
  • 原文地址:https://www.cnblogs.com/mauiie/p/tai_io_FilterInputStream.html
Copyright © 2020-2023  润新知