Java的IO相关内容。
所有的流都实现了Closeable接口,所有流都又close方法,下面就不提close方法了。
字节流
最基础就是InputStream和OutputStream,这两个都是抽象类。
InputStream/OutputStream
最主要的就的read方法,它有三个重载方法
1 | int read() // 读取一个字节,返回读取的字节数据 抽象方法,需子类实现 |
其他的方法
1 | int available() // 流中还有多少可以读取的数据,返回字节个数 |
OutputStream
OutputStream只有下面几个方法
1 | flush() // 将缓存中的数据写入的磁盘 |
InputStream和OutputStream的增强
InputStream是非常基本的输入流,为了能提供一些其他的特性,IO包中还其他的流。
BufferedInputStream和BufferedOutputStream是提供内部缓冲区的流,以此可以提高性能,并支持标记和重置。其构造函数需要一个InputStream/OutputStream作为参数。
DataInputStream和DataOutputStream提供了对读取和写入Java基本数据类的支持。
ObjectInputStream和ObjectOutputStream提供了对Java对象的读写的支持。
PushbackInputStream能将一个或多个已经读取的字节数据放回流中。
其他输入输出流
FileInputStream和FileOutputStream是文件读取的相关流。
ByteArrayInputStream和ByteArrayOutputStream是和字节数组相关的流。
PipedInputStream和PipedOutputStream是管道流,两个类连接起来后,通过PipedOutputStream写入的数据可以让PipedInputStream读取到。
SequenceInputStream可以将多个输入流按顺序连接起来,形成一个完整的输入流,该流会按顺序依次读取多个流中的数据。
字符流
基本的字符流就是Reader和Writer,它们也都是抽象类。
字符流和字节流其实类似,只是一个是对字符进行处理,一个是对字节进行处理,两种都有类似的类。
Reader和其子类需要借助InputStreamReader使用InputStream来构造。
Writer和其子类需要借助OutputStreamWriter使用OutputStream来构造。
字符流需要注意的一点就是字符编码,在创建InputStreamReader和OutputStreamWriter的时候最好指定编码。Charset.forName(charsetName)
可以创建一个给定名字的编码,或者使用StandardCharsets
中的几个编码。