zoukankan      html  css  js  c++  java
  • Java中的stream流的概念解析

    概念

    流是字节序列的抽象概念。

    文件是数据的静态存储形式,而流是指数据传输时的形态。

    流类分为两个大类:节点流类和过滤流类(也叫处理流类)。

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

    包装类的调用过程如下图:


    流分类的关系

    不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类。这个四个类的关系如下:

    字节流                 字符流

    输入流      InputStream            Reader

    输出流      OutputStream          Writer

    Java内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内 Unicode 字符流之间的转换。而类InputStreamReader 和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

    InputStream


    由于InputStream和OutputStream是abstact类,所以它们还不能表明具体对应哪种IO设备。它们下面有许多子类,包括网络、管道、内存、文件等具体的IO设备,实际程序中使用的它们的各种子类对象。

    注:我们将节点流类所对应的IO源和目标称为流节点(Node)。

    注意:将A文件的内容写入B文件,程序对A文件的操作所用的是输出类还是输入类这个问题。输入输出类是相对程序而言的,而不是代表文件的,所以我们应该创建一个输入类来完成对A文件的操作,创建一个输出类来完成对B文件的操作。

    OutputStream


    以字符为导向的 stream Reader/Writer

    以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。同样,Reader/Writer也为abstact类。

    Reader


    Writer


    IO程序代码的复用:

    平时写代码用-1来作为键盘输入的结束,在写的函数中不直接使用System.in,只是在调用该函数时,将System.in作为参数传递进去,这样,我们以后要从某个文件中读取数据,来代替手工键盘输入时,我们可以直接使用这个函数,程序就不用做太多的修改了,达到以不变应万变的效果。

    字节流和字符流的相互转换

    InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。

    InputStreamReader类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。

    使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。

    InputStreamReader的read()方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。

    为了达到更高效率,考虑用BufferedReader封装InputStreamReader,

    BufferedReaderin = new BufferedReader(new InputStreamReader(System.in));


  • 相关阅读:
    高精度乘法
    使用BFG清除git仓库中的隐私文件或大文件
    java运行的问题
    eclipse编写的java程序在dos环境下运行的写法
    win32汇编实现阶乘和斐波那契数列
    十个数字不同,实现加减乘。暴力枚举法
    实现一个类模板
    循环队列类模板和函数模板c++实例
    C++析构函数为什么要为虚函数
    1012-Joseph 约瑟夫问题
  • 原文地址:https://www.cnblogs.com/Sherlock-J/p/12926015.html
Copyright © 2011-2022 走看看