字节流:
字节流:可以从或向一个特定的方向读写数据,数据是字节
封装流/处理流:针对字节流进行封装,即对一个已经存在的流
进行封装,通过所有的封装流能够对数据更有效
的读写,封装流的底层还是字节流
通常字节流被称之为低级流
处理流被称之为高级流或过滤流
InputStream 是所有字节流的父类,其定义了基础的读取方法
-int read() | 读取一个字节,以int的形式返回,该int的低8位有效否则返回-1,表示文件末尾EOF end of file
|
-int read(byte[] b) | 尝试最多读取给定数组length个字节,并存入该数组返回值为实际读取的字节量的长度,否则返回-1,到文件末尾
|
-int read(byte[] b,int offset,int len) | 将输入流中的最多len个数据写入byte数组,将从offset的位置开始写入数组,len不能超过数组的实际长度如果超过会报数组下标越界异常
|
-void close() | 关闭此输入流并释放与该流关联的所有的系统资源 |
OutputStream 是所有的字节流的父类,其定义了基础的写出方法
-void write(int d) | 写出整数数据的低8位 |
-void write(byte[] b) | 将给定的字节数组的数据全部写出
|
-void write(byte[] b,int offset,int len) | 将给定的字节数组从偏移量offset开始的len个字节写入输出流 |
-void flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
-void close() | 关闭此输出流,并释放与此输出流有关的所有的系统资源 |
FileInputStream:文件输入流
-可以操作文件的内容
-操作的是字节流
-继承自InputStream抽象类
-低级流
-操作的是文件
FileOutputStream:文件输出流
-可以操作文件内容
-操作的是字节流
-继承的是OutputStream抽象类
-低级流
-操作的是文件
缓冲流:Buffer缓冲 高级流之一
缓冲流的原理:
向硬件存储设备操作数据,导致增大跟硬件的交互次数,
会降低读写的速度,做缓冲流的目的就是为了尽量减少
跟硬件的交互次数
缓冲输出流的原理:
BufferedOutputStream缓维冲输出流内部会护一个缓冲区,
每当我们向该流写出数据时,都会先将数据存储入缓冲区,
当缓冲区已满的时候,缓冲流会将数据一次性写出
注意:
Void flush(),清除缓冲区,将缓冲区中的数据强制写出
以保证数据的完整
/**
* 缓冲输出流
* 减少跟硬盘的交互次数
*/
@Test
public void testMethod1()throws IOException{
//低级流,文件的字节流
OutputStream os=new FileOutputStream("d:/aa/bos.txt");
//对低级流,要做二次封装,把低级流转换成高级流
BufferedOutputStream bos=new BufferedOutputStream(os);
//用高级流的对象打点调用api方法,读写效率会有提升
bos.write("hello world".getBytes());
//清空缓冲,强制回写硬盘
bos.flush();
//关闭流资源
bos.close();
os.close();
}
缓冲输入流的原理:
BufferedInputStream缓冲输入流内部维护一个缓冲区,
每当我们向该流读入数据时,都会先将数据存入缓冲区,
BufferedInputStream的read方法会从缓冲区读取数据
当缓冲区全都读取完毕,如果再次read的时候,会再一次
把缓冲区填满,read在逐一从缓冲区读取数据,以此往复
/**
* 缓冲输入流
* 减少跟硬盘的交互次数
*/
@Test
public void testMethod2()throws IOException{
//低级的输入流
InputStream is=new FileInputStream("d:/aa/bos.txt");
//高级缓冲输入流,对低级流的二次封装
BufferedInputStream bis=new BufferedInputStream(is);
int d=-1;
while((d=bis.read())!=-1){
System.out.println((char)d);
}
bis.close();
is.close();
}
缓冲是靠牺牲内存来提升io的读写效率