IO总体框架介绍二

IO总体框架介绍二

IO流的体系结构

在学习IO流这里,我们将会接触到40多个不同的类,这些类看上去很杂乱,但实际上很有规则,如下图,是已经划分好的框架图:

在这里插入图片描述
主要的流的体系图:每个输入流都有相应的输出流
在这里插入图片描述

输入/输出流体系中常用的流的分类表:
在这里插入图片描述
注:表中粗体字所标出的类代表节点流,必须直接与指定的物理节点关联:斜体字标出的类代表抽象基类,无法直接创建实例。

四大基类流介绍

InputStream,Reader,OutputStream以及Writer,这四大抽象基类,本身并不能创建实例来执行输入/输出,但它们将成为所有输入/输出流的模版,所以它们的方法是所有输入/输出流都可以使用的方法

1.InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类,主要包含三个方法:

//读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;

//读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1。
int read(byte[] buffer) ;
//读取length个字节并存储到一个字节数组buffer,从off位置开始存,最多len,返回实际读取的字节数,如果读取前以到输入流的末尾返回-1。
int read(byte[] buffer, int off, int len) ;

2.Reader
Reader 是所有的输入字符流的父类,它是一个抽象类,主要包含三个方法:

//读取一个字符并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;
//读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入流的末尾返回-1。
int read(char[] cbuf) ;
//读取length个字符,并存储到一个数组buffer,从off位置开始存,最多读取len,返回实际读取的字符数,如果读取前以到输入流的末尾返回-1。
int read(char[] cbuf, int off, int len)
//对比InputStream和Reader所提供的方法,就不难发现两个基类的功能基本一样的,
//只不过读取的数据单元不同。在执行完流操作后,要调用close()方法来关系输入流,
//因为程序里打开的IO资源不属于内存资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源。
//除此之外,InputStream和Reader还支持如下方法来移动流中的指针位置:
//在此输入流中标记当前的位置
//readlimit - 在标记位置失效前可以读取字节的最大限制。
void mark(int readlimit)
// 测试此输入流是否支持 mark 方法
boolean markSupported()
// 跳过和丢弃此输入流中数据的 n 个字节/字符
long skip(long n)
//将此流重新定位到最后一次对此输入流调用 mark 方法时的位置

3.OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类,主要包含如下四个方法:

//向输出流中写入一个字节数据,该字节数据为参数b的低8位。
void write(int b) ;
//将一个字节类型的数组中的数据写入输出流。
void write(byte[] b);
//将一个字节类型的数组中的从指定位置(off)开始的,len个字节写入到输出流。
void write(byte[] b, int off, int len);
//将输出流中缓冲的数据全部写出到目的地。
void flush();

扫描二维码关注公众号,回复: 4492236 查看本文章

4.Writer
Writer 是所有的输出字符流的父类,它是一个抽象类,主要包含如下六个方法:

//向输出流中写入一个字符数据,该字节数据为参数b的低16位。
void write(int c);
//将一个字符类型的数组中的数据写入输出流,
void write(char[] cbuf)
//将一个字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流。
void write(char[] cbuf, int offset, int length);
//将一个字符串中的字符写入到输出流。
void write(String string);
//将一个字符串从offset开始的length个字符写入到输出流。
void write(String string, int offset, int length);
//将输出流中缓冲的数据全部写出到目的地。
void flush()

可以看出,Writer比OutputStream多出两个方法,主要是支持写入字符和字符串类型的数据。

flush方法和close方法区别

A: flush方法和close方法区别

a: flush()方法

用来刷新缓冲区的,刷新后可以再次写出,只有字符流才需要刷新

b: close()方法

用来关闭流释放资源的,如果是带缓冲区的流对象的close()方法,

不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出

使用Java的IO流执行输出时,不要忘记关闭输出流,关闭输出流除了可以保证流的物理资源被回收之外,还能将输出流缓冲区的数据flush到物理节点里(因为在执行close()方法之前,自动执行输出流的flush()方法)

应用

import java.io.*;

/**
 * 描述:IO四大基础流应用
 *
 * @Author administrator{GINO ZHANG}
 * @Date2018/12/4
 */
public class IOTest {
    public static void main(String[] args) {
        String path = "F:\\tulun   java\\Test1\\IO.txt";
        String str = "Hello World";

        outputStream(path,str);

        inputSream(path);

        Writer(path,str);

        Reader(path);

    }

    private static void Writer(String path, String str) {
        try{
            FileWriter fileWriter = new FileWriter(path);
            fileWriter.write(str);
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void Reader(String path) {
        try{
            FileReader fileReader = new FileReader(path);
            char[] chars = new char[11];
            fileReader.read(chars);
            String string = new String(chars);
            System.out.println(string);
            fileReader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void outputStream(String path, String str) {
        try{
            FileOutputStream fileOutputStream = new FileOutputStream(path);
            fileOutputStream.write(str.getBytes());
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void inputSream(String path) {
        try{
            FileInputStream fileInputStream = new FileInputStream(path);
            byte[] bytes = new byte[11];
            fileInputStream.read(bytes);
            String string = new String(bytes);
            System.out.println(string);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

打印结果:

C:\java\java7\jdk1.7.0_80\bin\java.exe -javaagent:D:\ideaIU-2018.1.5.win\lib\idea_rt.jar=14545:D:\ideaIU-2018.1.5.win\bin -
Hello World
Hello World

Process finished with exit code 0

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42262357/article/details/84793337
今日推荐