流的分类
java-IO将流分为几种类别:
-
按流向分为:输入和输出
-
按类型分为:字节和字符
-
按功能分为:节点流和处理流
字节流
所谓字节流,其实就是将数据以字节为单位进行读写相关操作,字节流一般用于对于一些二进制文件(图片,音频,视频等)进行读写操作,java中的字节流都是来自以下两个抽象类:
-
InputStream(字节输入流)
-
OutputStream(字节输出流)
InputStream类
inputStream类是所有字节输入流的父类,是一个抽象类,常用方法包含以下:
-
available():获取当前流中的可读字节数
-
close():关闭此流
-
read():从流中读取一个字节,返回读取到的字节
-
read(byte[] b):将流中读取到的字节存入到指定的字节数组中,返回真实读取的长度,读取不到返回-1
-
read(byte[] b,int offset,int len):将流中读取奥的字节存入到指定的字节数组中(跳过offset个字节存储,存储长度为len),读取不到返回-1
InputStream类的常见子类有FileInputStream,ByteArrayInputStream,ObjectInputStream,FilterInputStream等
OutputStream类
OutputStream类是所有字节输出流的父类,是一个抽象类,常用方法如下:
-
write(byte[] b):将字节数组中的内容写入输出源(文件,网络,内存)
-
write(byte[] b,int offset,int len):将字节数组中的内容从offset开始写入len长到输出源
-
write(int b):将一个字节写入输出源
-
flush():将流中的数据强制刷新到输出源
-
close():关闭此流
OutputStream类的常见子类有FileOutputStream,ByteArrayOutputStream,ObjectOutputStream,FilterOutputStream等
字符流
字符流,顾名思义,是以字符的形式对输入输出源操作,通常情况下一个字符表示两个字节,但是在一些unicode编码,如UTF-8则使用3个字节表示,但是由于字符流的特殊性,一般用字符流主要操作一些文本输入输出源(文本文档,记事本文件等字符数据);java中所有的字符流都从以下两个抽象类继承:
-
Reader 字符输入流
-
Writer 字符输出流
Reader
字符输入流,是所有字符输入流的父类,是一个抽象类,内部的常见方法如下:
-
read():读取并返回一个字符
-
read(char[] c):将从流中读取的字符存储到字符数组
-
read(char[] c,int offset,int len):将从流中读取的字符存入字符数组(跳过offset个字节,写入len长)
-
ready():返回此流是否准备好被读取的状态
-
close():关闭此流
Reader类的常见子类包含:InputStreamReader,BufferedReader,FilterReader,PipedReader等
Writer
字符输出流,是所有字符输出流的父类,是一个抽象类,内部的常见方法如下:
-
append(char c):向流中追加一个字符
-
append(CharSequence c):向流中追加一个字符序列(字符串)
-
witer(String s):写入一个字符串到目标输出源
-
witer(char[] c):写入字符数组到目标输出源
Writer类的常见子类包含:OutStreamReader,BufferedWriter,FilterWriter,PipedWriter等
转换流、缓冲流打印流
由于以上所提到的流,按照功能来说都属于节点流(直接跟输入输出源打交道),而在实际开发中有些需求可能会涉及到需要将字节流转换为字符流,或者将字符流转换为字节流等一些转换操作;另外也有可能需要将这些低级的节点流提高读取和写入效率,因此还需要一些高级流来进行处理,因此这些高级流也被称之为处理流,比如:转换流,缓冲流,打印流等。
转换流
java-io中的转换流主要分为两个:
-
InputStreamReader:将字节流转换为字符流的桥梁
-
OutputStreamWriter:将字符流转换为字节流的桥梁
缓冲流
缓冲流的出现主要为了提高节点流的读取和写入效率,使用方式通常为将其他节点流包装起来,io包中的缓冲流分为以下几个:
-
BufferedReader
-
BufferedWriter
-
BufferedInputStream
-
BufferedOutputStream
打印流
-
另外在IO包中还提供了两个特殊的流,这两个流只有输出,没有输入:
-
PrintStream 字节打印流
-
PrintWriter 字符打印流
-
打印流通常可以对其他输出流(Writer,OutputStream)以及文件(File)进行包装,然后通过提供的相关API操作这些流,常见构造器:
-
PrintStream
-
PrintStream(File file)
-
PrintStream(String fileName)
-
PrintStream(OutputStream os)
-
PrintStream(OutputStream os,boolean autoFlush)
-
-
PrintWriter
-
PrintWriter(File file)
-
PrintWriter(String fileName)
-
PrintWriter(OutputStream os)
-
PrintWriter(OutputStream os,boolean autoFlush)
-
PrintWriter(Writer w)
-
PrintWriter(Writer w,boolean autoFlush)
RandomAccessFile
RandomAccessFile类是java.io包中一个特别的类,简称随机访问文件流,这里的“随机”不是随机读取或者写入的意思,而是说可以使用该类实现在文件的任意位置进行读写操作;因此,该类既可以实现输入流(InputStream)相关功能,也能实现输出流(OutputStream)相关功能,另外RandomAccessFile类从DataInput和DataOutput接口实现,具备直接操作元数据的能力,RandomAccesFile操作文件包含两个构造器:
-
-
RandomAccessFile(File file,String mode)
-
RandomAccessFile(Stirng fileName,String mode)
-
以上构造器中mode参数为设置流的读写模式,可选值为以下四个:
-
"r" 以只读方式打开流
-
常用方法包含以下:
-
read() 从流中读取一个字节
-
read(byte[] b) 将流中读取的字节存储到字节数组
-
readInt() 从流中读取一个int数据
-
readDouble() 从流中读取一个double数据
-
readBoolean() 从流中读取一个boolean数据
-
readChar() 从流中读取一个char数据
-
...
-
write(int b) 写入字节到文件中
-
write(byte[] b) 写入字节数组到文件中
-
writeInt(int i) 以元数据的方式写入一个int值到文件中
-
writeDouble(double d) 以元数据的方式写入一个double值到文件中
-
writeBoolean(boolean b) 以元数据的方式写入一个boolean值到文件中
-
writeChar(int c) 以元数据的方式写入一个char值到文件中
-
...
-
getFilePointer() 获取当前流中的文件指针
-
seek(long l) 跳过指定长度字节数之后发生下一个读取或者写入
-
“rw” 以读写方式打开流
-
"rws" 基于“rw”还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备
-
"rwd" 基于“rw”还要求对文件内容的每个更新都同步写入到底层存储设备