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. EasyUI queryParams属性 在请求远程数据同时给action方法传参

    http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方 ...

  2. 浅谈IOC--说清楚IOC是什么

    http://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1.IOC的理论背景 2.什么是IOC 3.IOC也叫依赖注入 ...

  3. stl 迭代器(了解)

    STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators ...

  4. 利用memcached构建高性能的Web应用程序(转载)

    面临的问题 对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的边 ...

  5. 超常用的PHP正则表达式收集整理

    以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式. 一.表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-z ...

  6. FastMM的安装方法

    FastMM 快速在D2006和2007中已代替了原来的内存管理器.D7也可以使用,而且很方便哦.请看步骤: 1. FastMM是开源项目,去她老家先拖个来. http://sourceforge.n ...

  7. Step

    php+MySQL html+css JQuery Mobile JavaScript weiPHP Sina Cloud 微信公众订阅号平台开发

  8. PHPNG (next generation)

    PHPNG (next generation) This page gives short information about development state of a new PHP branc ...

  9. 【GoLang】GoLang GOPATH 工程管理 最佳实践

    参考资料: MAC下 Intellij IDEA GO语言插件安装及简单案例:http://blog.csdn.net/fenglailea/article/details/53054502 关于wi ...

  10. poj 2709

    http://poj.org/problem?id=2709 题意:就是那个老师需要n瓶颜色的墨水,和1瓶颜色的灰色的墨水,但是灰色的墨水没得卖,只能由三种颜色相同的墨水混合而成,但是3瓶50ML的墨 ...