IO总结
IO基本概念讲解
IO流概念
- IO流是实现输入/输出的基础,方便的实现了数据的输入/输出操作,在java把不同的输入/输出抽象为“流”,流是一组有顺序,有起点和终点的字节集合,是对数据传输的总称或抽象。
IO流分类
输入流和输出流。
输入流:只能从中读取数据,而不能向其中写入数据。(如:从硬盘读取文件到内存)
输出流:只能向其写入数据,而不能从中读取数据。(如:从内存读取数据到硬盘)
字节流和字符流
字节流:以字节为单位,每次读取或写入是8位数据,可以读取任意类型数据。
字符流:以字符为单为,每次读取或写入是16位数据,只能读取字符类型数据。
读取文本文件优先考虑字符流,读取图片,视频等非文本类型的只能使用字节流。
节点流和处理流
节点流:直接与数据源相连,读入或读出,也被称之为低级流。
处理流:是对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写操作,也被称之为高效流。
IO流结构图
IO流的四大基类(四大基类均为抽象类不可实例化)
|
|_Reader
|_Writer
|_InputStream
|_OutputStream
- Reader常用方法
int read();
//读取一个字符并以整数形式返回,如果返回-1表示已到输入流末尾。
int read(char[] buffer);
//读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入流末尾返回-1
int read(char[] buffer,int off,int len);
//读取length个字符并存储到一个字符数组buffer,从off位置开始,最多len,返回实际读取字符数,如果读取前已到输入流末尾返回-1.
- Writer常用方法
void write(int c);
//向输出流中写入字符数据,该字节数据为参数
void write(char[] c);
//将一个字符类型的数组中的数据写入到输出流。
void write(char[] c,int off,int length);
//从一个字符类型的数组中的指定位置开始,length个字符写入到输出流。
void write(String string);
//将一个字符串中的字符写入到输出流。
void write(String ,int off,int length);
//将一个字符串从off开始的length个字符写入到输出流.
void flush();
//将输出流中的缓冲数据全部写出到目的地。
- InputStream常用方法
int read();
//读取一个字节并以整数的形式返回,如果返回-1已到达输出流末尾。
int read(byte[] buffer);
//读取一系列字节并存储到一个数组,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
int read(byte[] buffer,int off,int len);
//读取length个字节并保存到一个字节数组,从off位置开始存,最多len,返回实际读取的字节数,如果读取前已到输出流的末尾返回-1.
- OutputStream常用方法
void write(int b);
//向输出流中写入一个字节数据,该字节数据为参数b。
void write(byte[] b);
//将一个字节类型的数组中的数据写入到输出流。
void write(byte[] b,int off,int len);
//将一个字节类型的数组中的数据从指定位置开始,len个字节写入到输出流。
void flush();
//将输出流中的缓冲数据全部写出到目的地。
注:java的IO流执行完成后,均要关闭流,调用close()方法,释放资源
- InputStream/OutpurStream简单演示
/**
* @program: Bridge Pattern
* @description:测试高效流与普通流用时
* @author: Mr.Yan
* @create: 2019-03-03 01:35
**/
public class IO {
public static void main(String[] args) throws Exception {
IO.buffer();
IO.file();
}
public static void buffer() throws Exception {
long l = System.nanoTime();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\迅雷下载\\win7x64.iso"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\高效流.iso"));
byte[] b = new byte[1024 * 1024];
int i;
while ((i = bis.read(b)) != -1) {
bos.write(b, 0, i);
}
long l1 = System.nanoTime();
System.out.println("高效流用时:" + (l1 - l) / 1000 + "秒");
bis.close();
bos.close();
}
public static void file() throws Exception {
long l = System.nanoTime();
FileInputStream fis = new FileInputStream(new File("E:\\迅雷下载\\win7x64.iso"));
FileOutputStream fos = new FileOutputStream(new File("E:\\file.iso"));
byte[] b = new byte[1024 * 1024];
int i;
while ((i = fis.read(b)) != -1) {
fos.write(b, 0, i);
}
long l1 = System.nanoTime();
System.out.println("普通流用时:" + (l1 - l) / 1000 + "秒");
fis.close();
fos.close();
}
}
- Reader/Writer简单演示
public class IO2 {
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\使用说明.txt"),"utf-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\aaa.txt"),"utf-8");
int i;
char[] c = new char[1024];
while ((i = isr.read(c))!= -1) {
osw.write(c,0,i);
}
isr.close();
osw.close();
}
}