Java IO流分析整理

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数据文件流的一般步骤:

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

字符输入流:

字符输出流:

时间: 2024-10-04 20:09:55

Java IO流分析整理的相关文章

java io流 分析

java io流 在java应用或者android应用中很常见,并且使用频率很高的一个模块.当时每次需要用到这个模块的时候总是有提笔忘字的感觉,不知道该用哪个流或者该用谁包装谁. 所以我就花了一点时间把这个块的结构梳理了一下.一是能让自己理清一下思路.二是以后如果还有提笔忘字的时候,看这篇文章就好了. 首先java io流分两大系统InputStream 和Reader,前者及其子类主要用于读取字节流,后者及其子类主要用于读取字符流.下面是InputSteram系的继承树 首先可以看InputS

Java IO流详尽解析(转自 http://www.2cto.com/kf/201312/262036.html)

流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表.字节流和字符流的区别

Java IO流详尽解析(大神之作)

流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表.字节流和字符流的区别

Java IO流详尽解析

流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流.根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表.字节流和字符流的区别: 读写单位不同:字节流以字节(8bit)为单位,字符

Java IO流详尽解析(转)

流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表.字节流和字符流的区别

Java IO流(二)

目录 Java IO流(二) 7. 字节缓冲流 7.1 概述 7.2 BufferedOutputStream类 7.3 BufferedInputStream类 8. 文件复制练习(增强版 使用缓冲流) 9. 字符缓冲流 9.1 BufferedWriter类 9.2 BufferedReader类 10. 练习:文本排序 11. 转换流 11.1 字符编码和字符集 11.2 编码引出的问题 11.3 转换流的原理 11.4 OutputStreamWriter类 11.5 InputStre

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画:

java io流(字节流)复制文件

java io流(字节流) 复制文件 //复制文件 //使用字节流 //复制文本文件用字符流,复制其它格式文件用字节流 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //字符流方式 //FileReader fz = new FileReader("E:/1.txt"); //FileWriter zt = new FileWriter(&qu