流的概念和作用
流是一组有顺序的的,有起点和终点的字节集合,是对数据传输的总称或抽象,数据在两个设备间的传输称为流,根据数据传输特性将流抽象为各种类,方便直观的进行数据操作。
Io流的分类
根据处理数据的类型不同分为:字符流和字节流。
根据数据流向分为:输入流和输出流。
字节和字符流
字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象。本质就是基于字符读取时,去查了指定的码表,
字节和字符流的区别:
- 读取单位不同:字节流以字节为单位(8bit),字符流以字符为单位,根据码表映射字符,一次可读取多个字符。
- 处理对象不同:字符流能处理所有的数据类型,而字符流只能处理字符类型的数据。
- 字节流在操作的时候,本身是不会用到缓存区的,是文件本身直接操作的;而字符流在操作的时候下面会用到缓存区,是通过缓存区来操作文件,
输入流和输出流
对于输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据传输数据的特性进行选择而使用不同的流。
![]()
Io流体系图
![]()
案例
文件拷贝
public class FileCopy {
public static void main(String[] args) {
FileInputStream fis=null;
FileOutputStream fos=null;
try {
File file = new File("F://图片//preview.jpg");
//创建文件输入流读取文件
fis = new FileInputStream(file);
//创建文件输出流
fos = new FileOutputStream(new File(file.getName()));
//创建缓冲字节数组 获取文件大小 创建一样大小的数组,一次读取
byte [] b = new byte[(int) file.length()];
while(fis.read(b)!=-1){
fos.write(b);
}
System.out.println("copy: "+file.getName()+"完毕!");
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}