一、大纲
1、流的分类
- 根据操作数据单位:字节流、字符流
- 根据数据流向:输入流、输出流
- 根据流的角色:节点流和处理流
2. 流的体系结构(只说重要的流)
抽象基类 | 节点流(文件流) | 缓冲流(处理流的一种) |
InputStream | FileInputStream | BufferedInputStream |
OutputStream | FileOutputStream | BufferedoutputStream |
Reader | FileReader | BufferedReader |
Writer | FileWriter | BufferedWriter |
怎么从流的类名判断出是什么类型的流?
- Input和Reader代表输入流 ,Output和Writer代表输出流
- 有File代表节点流,无File代表处理流
- 有Stream代表字节流,无Stream代表字符流
二、 字节缓冲流BufferedInputStream、BufferedoutputStream的使用
——在开发中很少用到字节流,因为效率低。缓冲流比字节流的效率高很多
import java.io.*;
/**
* 处理流之一:缓冲流的使用
*
* 1.缓冲流:
* BufferedInputStream
* BufferedOutputStream
* BufferedReader
* BufferedWriter
*
* 2.作用:提供流的读取、写入的速度
* 提高读写速度的原因:内部提供了一个缓冲区
*
* 3. 处理流,就是“套接”在已有的流的基础上。
*
*/
public class HTIO {
public static void main(String[] args) throws IOException{
//复制视频——使用字节流处理非文本文件
//1.实例化文件对象
File srcFile = new File("C:\\Users\\Administrator\\Desktop\\movie.MOV");
File desFile = new File("C:\\Users\\Administrator\\Desktop\\movie_copy.MOV");
//2.实例化流
//2.1 处理流是在节点流的基础上实例化的,也就是说实例化处理流需要传入一个节点流的对象
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(desFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.复制:读取、写入
byte[] buffer = new byte[1024];
int num;
while ((num=bis.read(buffer))!=-1){
bos.write(buffer);
}
//4.关闭流
bis.close();
bos.close();
//说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.
// fos.close();
// fis.close();
}
}
优化后的程序:
import java.io.*;
/**
* 处理流之一:缓冲流的使用
*
* 1.缓冲流:
* BufferedInputStream
* BufferedOutputStream
* BufferedReader
* BufferedWriter
*
* 2.作用:提供流的读取、写入的速度
* 提高读写速度的原因:内部提供了一个缓冲区
*
* 3. 处理流,就是“套接”在已有的流的基础上。
*
*/
public class HTIO {
public static void main(String[] args){
//复制视频——使用字节流处理非文本文件
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.实例化文件对象
File srcFile = new File("C:\\Users\\Administrator\\Desktop\\movie.MOV");
File desFile = new File("C:\\Users\\Administrator\\Desktop\\movie_copy.MOV");
//2.实例化流
//2.1 处理流是在节点流的基础上实例化的,也就是说实例化处理流需要传入一个节点流的对象
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(desFile);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//3.复制:读取、写入
byte[] buffer = new byte[1024];
int num;
while ((num=bis.read(buffer))!=-1){
bos.write(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bis!=null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bos!=null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.
// fos.close();
// fis.close();
}
}
- 是选中try区域 ctrl alt t 自动创建的
- 最后在关闭流的时候加入了for判断是否空指针,因为有可能bis和bos还没new的时候,就已经抛出异常了,避免空指针异常。