Java输入输出流详解(完整分类及示例)

Java输入输出流详解(完整分类及示例)-mikechen

什么是输入输出流?

Java将数据的输入输出操作当作“流”来处理,流是个抽象的概念,是对输入输出设备的抽象。

在Java程序中,从某个数据源读取数据到程序的流称为输入流,如下图所示:

Java输入输出流详解(完整分类及示例)-mikechen

通过程序使用数据流将数据写入到目的地的称为输出流,如下图所示:

Java输入输出流详解(完整分类及示例)-mikechen

 

Java输入流

1.Java输入流分类

Java输入输出流详解(完整分类及示例)-mikechen

从图中可以看出,Reader和InputStream为字符输入流。

字符流Reader类

Read抽象类是表示字符输入流的所有类的超类,它以字符为单位从数据源中读取数据。

其派生的常用子类说明如下:

InputStreamReader类

该类从数据源读取字节并将其解码为使用指定的字符集的字符。

FileReader类

该类继承于InputStreamReader,用于读取字符类文件,如文本文件。

BufferedReader类

该类用于将缓冲区中的数据以字符为单位读取。

 

字符流InputStream类

InputStream:表示字节输入流的所有类的超类,它以字节为单位从数据源中读取数据。

其派生的常用子类说明如下:

1)FileInputStream:被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作,一般用于程序读取文件系统中的文件。

2)BufferedInputStream:缓冲字节输入流,相对于 FileInputStream,使用BufferedInputStream读资源比FileInputStream读取资源的效率高。

3)ObjectInputStream:ObjectInputStream顾名思义,就是可以从流中读入一个用户自定义的对象。

 

2.Java输入流常用方法

1.read()方法是一个抽象方法:其是数据的读取源头,这个方法中要实现读取数据,返回读取的值,子类必须实现这个方法;

2.read(byte[])方法:用处是将流的输入读入byte[]数组,其实际上调用的是read(byte[], int, int);

3.read(byte[], int, int):将流读入byte[]数据的第off个位置开始,读取len个字节。

 

3.Java输入流示例

第一步:打开流,即创建字节文件输入流对象;

第二步:读数据,即通过流读取内容;

第三步:释放资源,即用完后关闭流资源。

详细代码示例如下:

public class FileInputStreamDemo {
    public void demo() throws Exception{
        //1:创建字节文件输入流
        FileInputStream fis  = new FileInputStream("mikechen.txt") ;
        int by = 0 ;

       //2:开始读数据
        while((by=fis.read())!=-1) {
            System.out.print((char)by);
        }   
     
        //3:释放资源
        fis.close();       
    }
}

 

Java输出流

1.Java输出流分类

Java输入输出流详解(完整分类及示例)-mikechen

从图中可以看出,Write和为OutputStream字符输出流。

1)ByteArrayOutputStream

ByteArrayOutputStream是对byte类型数据进行写入的类,相当于一个中间缓冲层,将类写入到文件等其他outputStream,它是对字节进行操作,属于内存操作流是字节数组输出流。

 

2)PipedOutputStream

PipedOutputStream是管道输出流,它的作用是让多线程可以通过管道进行线程间的通讯,在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。

 

3)FileOutputStream

FileOutputStream:是文件输出流,通常用于向文件进行写入操作,其继承OutputStream类。

 

4)FilterOutputStream

FilterOutputStream是过滤输出流,FilterOutputStream 的作用是用来“封装其它的输出流,并为它们提供额外的功能”。

FilterOutputStream它主要包括BufferedOutputStream, DataOutputStream和PrintStream。

 

5)ObjectOutputStream

ObjectOutputStream是对象输出流,它和ObjectInputStream一起对基本数据或者对象的持久存储。

 

2.Java输出流常用方法

OutputStream这个抽象类定义了常见的方法,如下所示:

>void close() 
关闭此输出流并释放与此流有关的所有系统资源。 

>void flush() 
刷新此输出流并强制写出所有缓冲的输出字节。 

>void write(byte[] b) 
将 b.length 个字节从指定的 byte 数组写入此输出流。 
         
>void write(byte[] b, int off, int len) 
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 

> abstract  void write(int b) 
将指定的字节写入此输出流。

 

3.Java输出流示例

public class OutputStreamDemo01{
     public static void main(String args[]) throws Exception{    // 异常抛出,不处理
       // 第1步、使用File类找到一个文件
        File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象
         // 第2步、通过子类实例化父类对象
        OutputStream out = null ;    // 准备好一个输出的对象
         out = new FileOutputStream(f)  ;    // 通过对象多态性,进行实例化
        // 第3步、进行写操作
         String str = "Hello World!!!" ;        // 准备一个字符串
         byte b[] = str.getBytes() ;            // 只能输出byte数组,所以将字符串变为byte数组
        out.write(b) ;                        // 将内容输出,保存文件
         // 第4步、关闭输出流
        out.close() ;                        // 关闭输出流
        //文件不存在会自动创建
    }
 };

 

 

 

 

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法