• Java IO 流


    Java IO流

     

    流的概念

      Java程序通过流来进行输入/输出。

      流是生产或消费信息的抽象。

      流通过Java的输入输出系统与物理设备链接。

      尽管物理设备不尽相同,但是所有流的行为具有同样的方式。

      这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着,一个输入流能够抽象多种类型的输入:从磁盘文件、从键盘或从网络套接字;同样,一个输出流可以输出到:控制台、磁盘文件或相连的网络。处理输入输出不需要代码理解键盘和网络的不同。

      Java中流的实现是在java.io包定义的类层次结构内部的。 

    输入/输出流概念

      输入/输出时,数据在通信通道中流动。

      所谓“数据流stream”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据是从一个地方流到另一个地方,这种数据流动的通道都可以称为数据流

      输入/输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是,一个是目的

      若程序是数据流的源,即数据的提供者,这个数据流相对于程序来说就是一个“输出数据流”(数据从程序流出);若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。

     

    输入/输出类

      在java.io包中提供了60多个类(流)。

      从功能上分为两大类:输入流和输出流。

      从流结构上可分为字节流(Byte Streams,以字节为处理单位或称面向字节)和字符流(Character Streams,以字符为处理单位或称面向字符)。

      字节流的输入流和输出流基础是InputStreamOutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。

      字符流是Java 1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类ReaderWriter

      在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。

     

    输入流和输出流的处理逻辑

    读数据的逻辑为:

      open a stream

      while more information

      read information

      close the stream

    写数据的逻辑为:

      open a stream

      while more information

      write information

      close the stream

     

    另一种流的分类

      节点流:从特定的地方读写的流类。例如,磁盘或一块内存区域。

      过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

      与目标相连的一定是节点流。

     

    InputStream

      三个基本的读方法:

      abstract int read() 

      抽象方法,所以InputStream是一个抽象类。读取输入流的下一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。

      int read(byte[] b) 

      从输入流读入一些字节数据,把它们放进一个数组b,返回实际读取的字节数,如果返回-1,表示读到了输入流的末尾。

      int read(byte[] b, int off, int len) 

      将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。

      为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的?

      因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现。所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。

      程序例子:

    InputStream例子——从文件输入
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class InputStreamTest1
    {
    
        public static void main(String[] args) throws IOException
        {
            InputStream is = new FileInputStream("d:/test.txt");
    
            byte[] buffer = new byte[200];
    
            int length = 0;
    
            while (-1 != (length = is.read(buffer, 0, 200)))
            {
                // 将字节数组转换成字符串
                String str = new String(buffer, 0, length);
                System.out.println(str);
            }
    
            // 将流所关联到的资源关闭
            is.close();
        }
    }

     

     

    参考资料

      圣思园张龙老师Java SE系列视频教程。

  • 相关阅读:
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-13 实现用户信息在页面显示
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-12 回顾cookie与session
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-11 实现用户登录
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-10 设置跨域配置实现前后端联调
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-9 使用tomcat运行前端源码
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-8 优化Swagger2显示
    阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-6 整合Swagger2文档api
    Swift实现Touch ID验证
    Mac上phantomjs装了不能用的解决
    after modifying system headers, please delete the module cache at
  • 原文地址:https://www.cnblogs.com/mengdd/p/2910143.html
Copyright © 2020-2023  润新知