Java中的IO流一

Java的IO相关内容。

所有的流都实现了Closeable接口,所有流都又close方法,下面就不提close方法了。

字节流

最基础就是InputStream和OutputStream,这两个都是抽象类。

InputStream/OutputStream

最主要的就的read方法,它有三个重载方法

1
2
3
int read() // 读取一个字节,返回读取的字节数据 抽象方法,需子类实现
int read(byte b[]) // 读取b.length个字节并放入b数组中,返回实际读取的字节数
int read(byte b[],int off, int len) // 读取len个自己放入数组b的off开始的位置,返回实际读取的字节

其他的方法

1
2
3
4
5
int available() // 流中还有多少可以读取的数据,返回字节个数
mark(int) // 做标记,reset后,流读取头会回到这个地方可以重读后面的数据,参数是可重读的最大字节数
boolean markSupported() // 流是否支持做标记
reset() // 重置,见上面的mark方法
long skip(long) // 跳过指定个数的字节数据

OutputStream

OutputStream只有下面几个方法

1
2
3
4
flush() // 将缓存中的数据写入的磁盘
write(int b) // 写入一个字节数据
write(byte b[]) // 写入b.length个字节数据
write(byte b[] int off, int len) // 写入数组b的off开始的len个自己数据

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中的几个编码。