什么是输入输出流?
Java将数据的输入输出操作当作“流”来处理,流是个抽象的概念,是对输入输出设备的抽象。
在Java程序中,从某个数据源读取数据到程序的流称为输入流,如下图所示:
通过程序使用数据流将数据写入到目的地的称为输出流,如下图所示:
Java输入流
1.Java输入流分类
从图中可以看出,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输出流分类
从图中可以看出,Write和为OutputStream字符输出流。
1)ByteArrayOutputStream
ByteArrayOutputStream是对byte类型数据进行写入的类,相当于一个中间缓冲层,将类写入到文件等其他outputStream,它是对字节进行操作,属于内存操作流是字节数组输出流。
2)PipedOutputStream
PipedOutputStream是管道输出流,它的作用是让多线程可以通过管道进行线程间的通讯,在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。
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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》