本文为个人学习总结,如内容有误,请大佬指出。
何谓IO流
IO即Input和Output,就是输入输出也就是读和写的意思。在Java中将程序对文件的读和写这个过程称作流。
流的分类
根据数据传输的方向(对于程序而言)可分为输入流和输出流,根据读取的数据类型可分为 字节流 和 字符流,从流的功能划分为节点流和处理流。
输入流和输出流
- 输入流
在程序与文件之间创建一个管道,让文件的数据能够流向程序,即读。 - 输出流
在程序与文件之间创建一个管道,让程序的数据能够流向文件,即写。
管道为单向的,确认流向后不能改变,即想要对一个文件同时进行读写操作时,需要分别创建输入流和输出流两个管道。(RandomAccessFile例外,它一个就能够对文件进行读写操作)
字节流和字符流
字节流
字节流一般用于操作二进制文件,对单个字节进行读写。:
- java.io.InputStream(所有字节输入流的超类)
- java.io.OutputStream(所有字节输出流的超类)
常见子类
- FileInputStream
- FileOutputStream
- ByteArrayInputStream
- ByteArrayOutputStream
- BufferedInputStream
- BufferedOutputStream
InputStream常见方法
close()
关闭流,完成读取操作后需要关流read()
读取一个字节,并返回其值read(byte[] b)
从源文件读取最多数组b长度的字节,并返回真实读取的字节数available()
返回源文件可读取的长度skip(long n)
跳过n个字节进行数据的读取
OutputStream常见方法
close()
关闭流write(byte[] b)
向目标文件写入数组b长度的字节write(byte[] b, int off, int len)
写入数组b里从off到off+len的数据write(int b)
写入一个字节bflush()
刷新流,强制将缓冲的字节写出(如果不刷新,在流未关闭前数据不会写到文件里)
使用方法:
File() f1 = new File("这里写入需要读取的文件的绝对路径");
File() f2 = new File("这里写入需要写入的文件的绝对路径");
//根据源文件创建输入流
InputStream is = new FileInputStream(f1);
//根据目标文件创建输出流
OutputStream os = new FileOutputStream(f2);
//获取源文件可读长度
int size = is.available();
//读取一个字节
int data1 = read();
//声明一个固定长度的缓冲数组
byte[] data2 = new byte[1024];
//临时存放读取长度
int len = 0;
//循环读取目标文件
while((len = is.read(data2)) != -1){
//将从源文件读到的数据写入目标文件(还未被写入)
os.write(data2, 0, len);
//刷新流,释放缓冲,将数据写入文件
os.flush();
}
//关闭流
os.close();
is.close();
字符流
一般用于读写纯文本文件,对单个字符进行读写,一个字符占两个字节
- java.io.Reader字符输入流的抽象超类
- java.io.Writer字符输出流的抽象超类
常见子类
- FileReader
- FileWriter
- InputStreamReader
- InputStreamWriter
- BufferedReader
- BufferedWriter
Reader常见方法
close()
关流read()
从源文件读一个字符并返回其值read(char[] c)
读取字符数组c长度的数据,返回实际读取长度read(char[] c, int off, int len)
读取len长度的数据储存到字符数组c从off到off+len的位置
Writer常见方法
close()
关流flush()
刷新流,强制将缓冲的字节写出(如果不刷新,在流未关闭前数据不会写到文件里)write(char c)
写一个字符write(String s)
写一个字符串write(char[] c)
写入字符数组c中的数据write(char[] c, int off, int len)
写入字符数组c里从off到off+len的数据
用法和字节流差不多
处理流
转换流
- InputStreamReader
- OutputStreamWriter
使用方法:
File() f1 = new File("这里写入需要读取的文件的绝对路径");
File() f2 = new File("这里写入需要写入的文件的绝对路径");
//根据源文件创建输入流
InputStream is = new FileInputStream(f1);
//根据目标文件创建输出流
OutputStream os = new FileOutputStream(f2);
//将文件字节输入流包装为字符输入流
InputStreamReader isr = new InputStreamReader(is);
//将文件字节输出流包装为字符输出流
OutputStreamWriter osw = new OutputStreamWriter(os);
//一般情况有字符输入输出流直接用就好了,不用转换这么麻烦
缓冲流
用来包装字节的缓冲流
- BufferedInputStream
- BufferedOutputStream
用来包装字符的缓冲流
- BufferedReader
- BufferedWriter
因为缓冲流内部定义有缓冲区,所欲用缓冲流包装过的流一般比未包装过的流读写效率要高一些。
用法:
File() f1 = new File("这里写入需要读取的文件的绝对路径");
File() f2 = new File("这里写入需要写入的文件的绝对路径");
//根据源文件创建输入流
InputStream is = new FileInputStream(f1);
//根据目标文件创建输出流
OutputStream os = new FileOutputStream(f2);
//包装输入流
BufferedInputStream bis = BufferedInputStream(is);
//包装输出流
BufferedOutputStream bos = BufferedOutputStream(os);
//字符的也一样
之前的学习日志啥时候想起来想写了啥时候再写
未完待续