IO流学习笔记
1、IO流概述
-
流的概念:
java中流是个抽象的概念,当java程序需要从某个数据源(内存,文件,网络等都可以是数据源)读取数据时,或者像某个数据源写入数据时,就会打开一个数据流。IO流是有起点,有终点的有序字节数列。简单的说,IO流就是以流的方式进行输入输出,通过IO流可以完成对硬盘文件的读和写。
所有的流都实现了java.io.closeable接口都有一个close方法,都是可关闭的,所有的流在被使用完后都需要调用close方法来关闭,以此来避免资源的浪费!
-
IO流分类:
依据流的方向分为:I 是输入流 InputStream 和 O 是输出流OutputStream(输入和输出是相对于内存而言的,即输入是往内存中输入数据,也就是程序读取数据。输出是从内存往硬盘中写入数据)所有的输出流都实现了java.io.flushable接口,都有flush方法。
依据流中读取数据的单位不同可分为:字节流和字符流
依据处理方式可分为:节点流和处理流
节点流:可以从或向一个特定的方向(节点)读写数据的流即为节点流,例如FileInputStream,FileOutputStream等
处理流:是对一个已经存在的流进行的连接和封装,即为对一个节点流进行包装的流为处理流,例如BufferedReader,BufferedWriter等
这个类以Stream单词结尾就是字节流,如果以reader结尾就是字符输入流,以writer结尾就是字符输出流
2、字节流
有的IO流是以字节为单位读取的数据的,这种流称为字节流。字节流每次读取一个字节的数据,既1byte数据(即八个二进制),字节流可以读取任意类型(文本文件、图片、视频、音频等文件)的文件。字节流通常以Stream这个单词为结尾
-
字节输入流
字节输入流的父类是InputStream,其中常用的子类有:
1、 FileInputStream把一个文件作为InputStream,实现对文件的读取操作
2、 ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
3、StringBufferInputStream:把一个String对象作为InputStream -
字节输出流
字节输出流的父类是OutputStream,其中常用的子类有:
1、FileOutputStream把一个文件作为InputStream,实现对文件的写入操作 。
2、ByteArrayOutputStream:把内存中的一个缓冲区作为OutputStream使用
-
常用的方法
1、available( ):返回从该输入流中可以读取的字节数的估计值,可以用于创建字节数组,可以不需要使用循环,但是使用available方法时需要斟酌使用,因为数组的大小有限,当文件过大时会产生问题!
2、skip( ):跳过几个字节不读取
3、flush():通常在写入文件之后调用一下,将数据全部写入文件中
3、字符流
以字符为处理数据的单位的流为字符流,每次读取一个字符。这种流是为了方便读取普通文本文件(扩展名为.txt的文件)而存在的,只能读取纯文本文件,不能读取图片,视频,音频等文件。通常以Writer单词为结尾的流为字符输出流,以Reader单位为结尾的流为字符输入流。
-
字符输入流,父类为Reader
子类有CharArrayReader,FileReader,BufferedReader,FilterReader,PipedReader,StringReader
-
字符输出流,父类为Writer
子类有CharArrayWriter,FileWriter,BufferedWriter,FilterWriter,PipedWriter,StringWriter,PrintWriter
4、缓冲流
使用缓冲流时,不需要自定义字节或字符数组,缓冲流自带有缓冲区。缓冲流是包装流,关闭流时,只需要关闭外层的流,内部的流会自动关闭。
-
java.io.BufferedReader
带有缓冲区的字符输入流
-
java.io.BufferedWriter
带有缓冲区的字符输出流
-
java.io.BufferedInputStream
带有缓冲区的字节输入流
-
java.io.BufferedOutputStream
带有缓冲区的字节输出流
5、转换流
通过转换流可以将字节流转换为字符流
-
java.io.InputStreamReader
将字节输入流转换为字符输入流
-
java.io.OutputStreamWriter
将字节输出流转换为字符输出流
6、标准输出流(打印流)
标准的输出流,默认输出到控制台,但是可以设置标准输出流的输出方向(调用setOut方法)。不需要手动调用close方法去关闭
-
java.io.PrintWriter
-
java.io.PrintStream
7、对象的序列化与反序列化
-
java.io.ObjectInputStream
java对象的反序列化:DeSerialize,将硬盘上的数据重新读取到java内存中,回复成java对象
当反序列化多个对象时,返回的是一个集合。
-
java.io.ObjectOutputStream
java对象的序列化:Serialize,将java文件保存到文件中,将java对象的状态保存到文件中
如果需要序列化多个对象,可以将多个对象放入集合中,然后序列化集合。
如果想实现对象的序列化,需要让对象实现Serializable接口,这个接口不是普通接口,而是标志接口,这个接口中没有任何内容,他是给java虚拟机参考的,java虚拟机识别这个标志接口后,会自动生成一个序列化版本号(尽量手写而不要自动生成)。序列化版本号是用来区分不同的类的标识。
8、数据流
数据流可以将数据连同数据的类型一起写到文件中,写入的文件不是纯文本文件。
使用DataOutputStream写入的数据只能通过DataInputStream读取
- java.io.DataOutputStream
的标识。
8、数据流
数据流可以将数据连同数据的类型一起写到文件中,写入的文件不是纯文本文件。
使用DataOutputStream写入的数据只能通过DataInputStream读取
- java.io.DataOutputStream
- java.io.DataInputStream