文章目录
I/O流
比较重要的IO流就在这了。除了序列化的I/O流(Object开头的)
字节流
主要对于字节的操作,比较适合文本以外的文件的读写,如图片、视频、音乐等。
InputStream
方法 | 方法介绍 |
---|---|
public abstract int read() | 读取数据 |
public int read(byte b[]) | 将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度 |
public int read(byte b[], int off, int len) | 从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的 |
public void close() | 读取完,关闭流,释放资源 |
public long skip(long n) | 跳过指定个数的字节不读取,想想看电影跳过片头片尾 |
public int available() | 返回可读的字节数量 |
public synchronized void mark(int readlimit) | 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断 |
public synchronized void reset() | 重置读取位置为上次 mark 标记的位置 |
public boolean markSupported() | 判断当前流是否支持标记流,和上面两个方法配套使用 |
注意,先定义一个
byte[1024]
再使用read(byte[])
也属于一种缓冲,相当于先一次性读取1024字节的数据后打包,可以有效提高效率。
OutputStream
方法 | 方法介绍 |
---|---|
public abstract void write(int b) | 写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。 |
public void write(byte b[]) | 将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。 |
public void write(byte b[], int off, int len) | 将 byte 数组从 off 位置开始,len 长度的字节写入 |
public void flush() | 强制刷新,将缓冲中的数据写入 |
public void close() | 关闭输出流,流被关闭后就不能再输出数据了 |
FileInputStream
适用于读文件的输入流。
FileOutputStream
输出文件/写文件的类。
构造方法:
FileOutputStream (File file)
对于某个指定文件的写方法,像是只能在某个本子上写字的笔FileOutputStream (String fileName)
这个文件可以直接用文件名等效代替FileOutputStream (File/String xx , boolean append)
append的翻译是“追加,增加”,因此append为true时,写方法会在文件末尾写,相反,会从文件开头进行覆盖。
BufferedInputStream
使用Buffer(缓冲)相当于将IO流中的数据打包再传输,可以提高读写的效率。
常用方法同InputStream。
BufferedOutputStream
常用方法同OutputStream。
字符流
字符流:主要对字符进行操作,比较适用于文本的读写。
Reader
方法 | 方法介绍 |
---|---|
public int read(java.nio.CharBuffer target) | 读取字节到字符缓存中 |
public int read() | 读取单个字符 |
public int read(char cbuf[]) | 读取字符到指定的 char 数组中 |
abstract public int read(char cbuf[], int off, int len) | 从 off 位置读取 len 长度的字符到 char 数组中 |
public long skip(long n) | 跳过指定长度的字符数量 |
public boolean ready() | 和上面的 available() 方法类似 |
public boolean markSupported() | 判断当前流是否支持标记流 |
public void mark(int readAheadLimit) | 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断 |
public void reset() | 重置读取位置为上次 mark 标记的位置 |
abstract public void close() | 关闭流释放相关资源 |
Writer
方法 | 方法介绍 |
---|---|
public void write(int c) | 写入一个字符 |
public void write(char cbuf[]) | 写入一个字符数组 |
abstract public void write(char cbuf[], int off, int len) | 从字符数组的 off 位置写入 len 数量的字符 |
public void write(String str) | 写入一个字符串 |
public void write(String str, int off, int len) | 从字符串的 off 位置写入 len 数量的字符 |
public Writer append(CharSequence csq) | 追加吸入一个字符序列 |
public Writer append(CharSequence csq, int start, int end) | 追加写入一个字符序列的一部分,从 start 位置开始,end 位置结束 |
public Writer append(char c) | 追加写入一个 16 位的字符 |
abstract public void flush() | 强制刷新,将缓冲中的数据写入 |
abstract public void close() | 关闭输出流,流被关闭后就不能再输出数据了 |
InputStreamReader
是Reader的子类,可以将字节流的I/O流通过字符集转换为字符流的形式,相当于是把字节流转变成字符流的桥梁。
构造方法:
public InputStreamReader (InputStream 类实例,*可选*String charsetName字符集名称)
,通过指定字符集将字节流转换成字符流处理。不指定则使用默认字符集。
特有方法:
public String getEncoding()
返回此流使用的字符编码名。
public boolean ready()
告知是够准备读取此流。
OutputStreamWriter
类似上一个方法。
构造方法:
public OutputStreamWriter (OutputStream 类实例,*可选*String charsetName字符集名称)
,通过指定字符集将字节流转换成字符流处理。不指定则使用默认字符集。
FileReader
是Reader的子类,主要方法同Reader。
FileWriter
是Writer的子类,主要方法同Writer。
BufferedReader
构造方法 | 描述 |
---|---|
BufferedReader(Reader in) | 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in, int sz) | 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 |
主要方法:较Reader方法,多了一个特有方法:String readLine()
这个方法一次可以读取一个文本行,返回的直接就是这一行的字符串,如果读到行尾了就返回null。
reader.readLine()方法返回的一行字符中不包含换行符,所以输出的时候要自己加上换行符。
BufferedReader比FileReader高级的地方在于FileReader能一次读取一个字符,或者一个字符数组。而BufferedReader也可以,同时BufferedReader还能一次读取一行字符串。同时,BufferedReader带缓冲,会比FileReader快很多。
但是FileReader使用项目的编码来读取解析字符,不能指定编码,可能会出现编码问题,但是InputStreamReader可以指定编码,通过使用包装InputStreamReader的BufferedReader,可以兼顾效率和编码。
BufferedWriter
构造方法和BufferedReader类似,都是包装一个父类,包括Writer
和OutputStreamWriter
.
构造方法 | 描述 |
---|---|
BufferedWriter(Writer out) | 创建一个缓冲字符输出流,使用默认大小的输出缓冲区 |
BufferedWriter(Writer out, int sz) | 创建一个缓冲字符输出流,使用给定大小的输出缓冲区 |
特有方法:相较Writer而言,多了一个特有方法:void newLine()
写入一个行分隔符。