Java IO流的分类

Java中的流,可以从不同的角度进行分类。

按流向分类:

输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。

按数据传输单位分类:

字节流:以字节(8位二进制)为单位进行处理。主要用于读写诸如图像或声音的二进制数据。

字符流:以字符(16位二进制)为单位进行处理。

都是通过字节流的方式实现的。字符流是对字节流进行了封装,方便操作。在最底层,所有的输入输出都是字节形式的。

后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

按功能分类:

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

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

不同的输入输出流

JDK提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)

字节输入流:

字节输入流抽象类及其关键的方法:
类 InputStream

java.io.InputStream
abstract int read()
从输入流中读取数据的下一个字节。

int read(byte[] b)

从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

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

将输入流中最多 len 个数据字节读入 byte 数组。

 
输入流的操作:
打开一个输入流
循环读取
关闭输入流

这里使用InputStream的子类FileInputStream读入文件:

public static void main(String[] args) throws IOException {

    //创建文件输入流
    InputStream is = new FileInputStream("D:/itzhai/arthinking.txt");
    //创建字节缓冲
    byte[] buffer = new byte[100];
    int length = 0;
    //以字节形式循环读取文件
    while((length = is.read(buffer, 0, buffer.length)) != -1){
        //把字节转换成字符并输出
        String str =new String(buffer, 0, length);
        System.out.println(str);
    }
}
抽象类InputStream的类层次:

字节数组输入流ByteArrayInputStream

把字节数组作为源的输入流。

相关例子:

字节数组输入流:

public static void main(String[] args) {

    //创建读取数据源
    String input = "arthinking";
    //获取字节数组
    byte[] b = input.getBytes();
    //创建字节数组输出流
    ByteArrayInputStream bis = new ByteArrayInputStream(b);
    //循环逐个读取
    for(int i = 0; i < input.length(); i++){
        int c;
        //读取下一个字节
        while((c = bis.read()) != -1){
            System.out.print((char)c);
        }
    }
    //将缓冲区的位置重置为标记位置
    bis.reset();
}

 

字节数组输出流:

public static void main(String[] args) throws IOException {

    //创建字节输出流
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    String output = "arthinking";
    //创建需要输出的字节数组
    byte[] buffer = output.getBytes();
    //把字节数组写到输出流
    bos.write(buffer);
    //创建文件输出流
    OutputStream os = new FileOutputStream("D:/itzhai/arthinking.txt");
    //把字节输出流写到文件输出流
    bos.writeTo(os);

}

  

字节输出流:

字节输出流的抽象类及其最关键的方法:
类 OutputStream
java.lang.Object
java.io.OutputStream
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。

void write(byte[] b, int off, int len)

 

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

abstract void write(int b)

将指定的字节写入此输出流。

由此可以看出,只有最后一个方法才是抽象的,原因是前面两个都调用了第三个抽象方法,这样继承这个抽象类的子类都必须提供抽象的write(int b)的实现,从而使得每个子类的实现都不一样。

输出流的操作:
打开输出流
循环写入
关闭输入流

这里使用了OutputStream的子类FileOutputStream输出到文件:

public static void main(String[] args) throws IOException {
    //创建一个输出流
    OutputStream os = new FileOutputStream("D:/itzhai/arthinking.txt", true);
    String output = "http://www.itzhai.com";
    //从字符串中获取字节数组
    byte[] buffer = output.getBytes();
    //写出到输出流
    os.write(buffer);
    //关闭输出流
    os.close();
}

  

抽象类OutputStream的类层次结构:

过滤流:

过滤流不能直接跟文件打交道,只能通过节点流进行相关的操作。可以从其构造方法中看出:

FilterOutputStream(OutputStream out)

需要传入一个OutputStream。

在InputStream和OutputStream的子类中,

FilterInputStream和FilterOutputStream是过滤流,其又派生出子类DataInputStream和DataOutputStream数据输入流和数据输出流。

过滤流的主要特点是在输入输出数据同时对所传输的数据做指定类型或格式的转换。

缓冲输出流BufferedOutputStream

该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

当缓冲区写满或者关闭输出流时,一次性输出到流,或者调用flush()方法主动将缓冲区输出到流。

过滤流的使用例子:

使用过滤流类BufferedOutputStream和DataOutputStream装饰FilterOutputStream的例子

public static void main(String[] args) throws IOException {

    //创建数据输出流
    DataOutputStream dos = new DataOutputStream(
            new BufferedOutputStream(new FileOutputStream("D:/itzhai/arthinking.txt")));
    byte a = 1;
    char b = 'a';
    int c = 2;
    //使用数据输出流对象的方法写出数据到输出流
    dos.write(a);
    dos.write(b);
    dos.write(c);
    //关闭数据输出流
    dos.close();
    //创建数据输入流
    DataInputStream dis = new DataInputStream(
            new BufferedInputStream(new FileInputStream("D:/itzhai/arthinking.txt")));
    //使用数据输入流的方法从输入流中读取数据
    System.out.println(dis.readByte() + dis.readChar() + dis.readInt());
    //关闭数据输入流
    dis.close();
}

  

使用DataInputStream和DataOutputStream数据文件流的一般步骤:

  • 创建字节文件流对象
  • 基于字节文件流对象建立数据文件流对象
  • 用数据文件流对象的方法对基本类型的数据进行输入/输出 

字符输入流:

字符输出流:

图片来自论坛资料

Java IO流系统整理的更多相关文章

  1. java IO流 内容整理

    在java中,对数据的输入和输出操作以流的方式进行.(注:对文件的操作用io.File类,但不能对文件中的内容进行操作) 一.IO流的分类: 按数据流的方向不同,可以分为输入流和输出流: 按处理数据的 ...

  2. Java IO流分析整理 .

    Java中的流,可以从不同的角度进行分类. 按照数据流的方向不同可以分为:输入流和输出流. 按照处理数据单位不同可以分为:字节流和字符流. 按照实现功能不同可以分为:节点流和处理流. 输出流: 输入流 ...

  3. java IO流整理

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  4. Java IO流学习

    Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...

  5. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  6. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  7. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  8. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. JAVA.IO流学习笔记

    一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...

随机推荐

  1. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  2. TP中二维数组的遍历输出

    例子分析 <volist name="list" id="vo"> <volist name="vo['sub']" id ...

  3. Initialization of deep networks

    Initialization of deep networks 24 Feb 2015Gustav Larsson As we all know, the solution to a non-conv ...

  4. 统一软件开发过程(rup)理解

    不好意思,没有内容,请看百科吧http://baike.baidu.com/link?url=-zXA6oXiHRts5Z1THGzie7seH-YRigfiR7KRppP6TYcnnb7_Bxc_f ...

  5. NAT/PAT

    NAT/PAT 编辑 NAT就是网络地址翻译的英文缩写,在路由器上配置NAT服务,可提供公司内100~200人同时上网的服务.不需要Proxy Server,所有的服务都可顺利使用(除Netmeeti ...

  6. [BZOJ4632]树的编码

    [BZOJ4632]树的编码 试题描述 SHUXK 正在对一棵N个结点的有根树进行研究,首要的一件事就是对这棵树进行编码. lz 说:“这还不容易吗?我令根节点的编号为 1,然后保证每个结点的编号都比 ...

  7. hiho一下 第九十四周 数论三·约瑟夫问题

    数论三·约瑟夫问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho的班级正在进行班长的选举,他们决定通过一种特殊的方式来选择班长. 首先N个候选人围成一个 ...

  8. Linux netstat详解

    做计算机管理员,我们都必要了解一下netstat这个命令,它是一个查看网络连接状态的工具,在windows下也默认有这个工具.Netstat命令详解 netstat命令怎样使用 如何关闭TIME_WA ...

  9. NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)

    Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...

  10. .html和.htm的区别

    很多人会认为网页扩展名html和htm是等同的,但事实上他们还是有区别的. 包含HTML内容的文件最常用的扩展名是.html,但是像DOS这样的旧操作系统限制扩展名为最多3个字符,所以.htm扩展名也 ...