zoukankan      html  css  js  c++  java
  • 十一、I/O流(阶段三)

    一、什么是流

    什么是流(Stream),流就是一系列的数据(像01010001010010这种)

    当不同的介质之间有数据交互的时候,JAVA就使用流来实现。
    数据源可以是文件,还可以是数据库,网络甚至是其他的程序

    比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流
    输入流: InputStream
    输出流:OutputStream

    二、流的分类

    1、按数据流的方向不同:输入流,输出流。

    (1)通常程序需要从外部获取/输出信息
              这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等。
              “信息”也可以是任何类型的,例如一个对象、一串字符、图像、声音等。
    (2)通过使用java.io包中的输入/输出流类就可以达到输入输出信息的目的

    输入是指数据流入程序。
    输出是指数据从程序流出。

    2、按处理数据单位不同:字节流,字符流。

    (1) 字节流:数据流中最小的数据单元是字节。
    (2)字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

    3、按功能不同:节点流,处理流。

    (1)程序用于直接操作目标设备所对应的类叫节点流。
    (2)程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流。

     

    4、节点流与处理流的区别

    (1)节点流是低级流,直接跟数据源相接。

        处理流(也叫包装流)把节点流包装了一层,属于修饰器设计模式,不会直接与数据源相连,通过处理流来包装节点流既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。

    (2)处理流的功能主要体现在以下两个方面:

           1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率。

           2.操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的内容,而不是输入/输出一个或多个水滴处理流可以嫁接在任何已存在的流的基础上。

    三、节点流

    1、节点流类型

    (1)File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream。、
    (2)Memory
           1)从/向内存数组读写数据: CharArrayReader与 CharArrayWriter、ByteArrayInputStream与ByteArrayOutputStream。
           2)从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream。
    (3)Pipe管道流。 实现管道的输入和输出(进程间通信): PipedReader与PipedWriter、PipedInputStream与PipedOutputStream。

     2、节点流执行的图示

    四、处理流

    1、处理流的类型

    - (1)Buffering缓冲流:在读入或写出时,对数据进行缓存,以减少I/O的次数:BufferedReader与BufferedWriter、BufferedInputStream与BufferedOutputStream。
    - (2)Filtering 滤流:在数据进行读或写时进行过滤:FilterReader与FilterWriter、FilterInputStream与FilterOutputStream。
    - (3)Converting between Bytes and Characters 转换流:按照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader):InputStreamReader、OutputStreamWriter。
    - (4)Object Serialization 对象流 :ObjectInputStream、ObjectOutputStream。
    - (5)DataConversion数据流: 按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream 。
    - (6)Counting计数流: 在读入数据时对行记数 :LineNumberReader、LineNumberInputStream。
    - (7)Peeking Ahead预读流: 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream。
    - (8)Printing打印流: 包含方便的打印方法 :PrintWriter、PrintStream。

    2、处理流执行的图示

    3、处理流之--缓冲流

    【1】对I/O进行缓冲是一种常见的性能优化,缓冲流为I/O流增加了内存缓冲区,增加缓冲区的两个目的:
    (1)允许Java的I/O一次不只操作一个字符,这样提高䇖整个系统的性能;
    (2)由于有缓冲区,使得在流上执行skip、mark和reset方法都成为可能。

    【2】缓冲流:它是要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,
    提高了读写的效率,同时增加了一些新的方法。例如:BufferedReader中的readLine方法,
    BufferedWriter中的newLine方法。

    【3】J2SDK提供了4种缓存流,常用的构造方法为:

    //字符输入流
    BufferedReader(Reader in)//创建一个32字节的缓冲区
    BufferedReader(Reader in, int size)//size为自定义缓存区的大小
    
    //字符输出流
    BufferedWriter(Writer out)
    BufferedWriter(Writer out, int size)
    
    //字节输入流
    BufferedInputStream(InputStream in)
    BufferedInputStream(InputStream in, int size)
    
    //字节输出流
    BufferedOutputStream(OutputStream in)
    BufferedOutputStream(OutputStream in, int size)

    【4】其他
    (1)缓冲输入流BufferedInputSTream除了支持read和skip方法意外,还支持其父类的mark和reset方法;
    (2)BufferedReader提供了一种新的ReadLine方法用于读取一行字符串(以 或 分隔);
    (3)BufferedWriter提供了一种新的newLine方法用于写入一个行分隔符;
    (4)对于输出的缓冲流,BufferedWriter和BufferedOutputStream,写出的数据会先在内存中缓存,
    使用flush方法将会使内存的数据立刻写出。

    示例1:

    import java.io.*;
    public class TestBufferStream1 {
      public static void main(String[] args) {
        try {
          FileInputStream fis = new FileInputStream(
              "d:\JavaProject\demo13\ProcessingStream\TestBufferStream1.java");
          BufferedInputStream bis = new BufferedInputStream(fis);
          int c = 0;
          System.out.println((char)bis.read());
          System.out.println((char)bis.read());
          bis.mark(100);/*在当前输入流的当前位置上做一个标志,允许最多再读入100个字节*/
          for(int i=0;i<=10 && (c=bis.read())!=-1;i++){
            System.out.print((char)c+" ");
          }
          System.out.println(); 
          bis.reset();/*把输入指针返回到以前所做的标志处*/
          for(int i=0;i<=10 && (c=bis.read())!=-1;i++){
            System.out.print((char)c+" ");
          }
          bis.close();
        } catch (IOException e) {e.printStackTrace();}
      }
    }

    示例2:

    import java.io.*;
    public class TestBufferStream2
    {
        public static void main(String[] args)
        {
        try{
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\JavaProject\demo13\BufferStream\dat2.txt"));
        BufferedReader br = new BufferedReader(new FileReader("D:\JavaProject\demo13\BufferStream\dat2.txt"));
        String s = null;
        for(int i=0;i<10;i++)
        {
            s = String.valueOf(Math.random());//产生一个小于1的正的随机数,并转换成字符串形式
            bw.write(s);//把字符串s写入到dat2.txt文件中
            bw.newLine();//写入一个行分隔符
        }
        bw.flush();//使用flush方法将会使内存的数据立刻写出
    
        while((s=br.readLine()) != null)
        {
            System.out.println(s);
        }
        bw.close();
        br.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    
        }
    }
  • 相关阅读:
    深入理解Guava Cache的refresh和expire刷新机制
    单机、分布式、集群的区别与联系
    理解Word2Vec
    Struts2 XML配置详解
    目标检测中的数据增强方法(附详细代码讲解)
    做笔记就用印象笔记,支持录音做笔记( 附剪藏 插件下载,一键将网页内容保存笔记中进行编辑)
    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)
    一招教你如何用Word直接打开PDF进行编辑,无需下载转换软件
    小白也能弄得懂的目标检测YOLO系列之YOLOv1网络训练
    小白也能弄懂的目标检测YOLO系列之YOLOV1
  • 原文地址:https://www.cnblogs.com/rozen-lin/p/14333635.html
Copyright © 2011-2022 走看看