1.BufferedInputStream和BufferOutputStream拷贝
带缓冲区的字节输入、输出流
BufferedInputStream的构造常用的一个是BufferedInputStream(InputStream in),可以看作对InputStream进行了包装,使其更加具有效率;由于参数中传递的InputStream,但是InputStream是抽象的,所以只能传递它的子类对象
public static void main(String [] args)throws IOException{
FileInputStream fis = new FileInputStream("xxx.txt"); //创建输入流对象,关联xxx.txt
FileOutputStream fos = new FileOutputStream("yyy.txt"); //创建输出流对象,关联yyy.txt
BufferedInputStream bis = new BufferedInputStream(fis); //创建缓冲区对象,对输入流进行包装
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b;
while((b=bis.read())!=-1){
bos.write(b);
}
bis.close();
bos.close();
}
带缓冲区的字节输入流、输出流的拷贝原理图
(1)缓冲思想
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,
java本身在设计的时候也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
(2)BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)从 BufferedInputStream中读取一个字节时BufferedInputStream会一次性从文件中读取8192个,存在缓冲区中,返回给程序一个
程序再次读取时,就不用找文件了,直接从缓冲区中获取,直到缓冲区中所有的都被使用过,才重新从文件中读取8192个
(3)BufferedOutputStream
BufferedOutputStream也内置了一个缓冲区(数组)
程序向流中写出字节时,不会直接写到文件,先写到缓冲中区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
2.flush和close方法
flush()方法
用来刷新缓冲区,刷新后可以再次写出
close()方法
用来关闭流释放资源的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出
3.字节流读写中文问题
字节流再读中文的时候可能会读到半个中文,造成乱码
字节流写出中文的问题
字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组"XXXXX".getBytes();
写出回车换行write("\r\n".getBytes());字节流读中文会出现一些问题,但是写中文还是可以写的
4.IO流的标准异常处理1.6版本
public static void main(String[] args) throws IOException { //此处抛出来异常因为IO流操作底层的,如果用
FileInputStream fis = null; //try...catch相当于把问题隐藏掉,所以要抛出来
FileOutputStream fos = null;
try {
fis = new FileInputStream("xxx.txt"); //读文件的异常基本是要读的文件不存在,会出现异常
fos = new FileOutputStream("yyy.txt"); //写文件的异常有可能是写的路径是不存在的
int b;
while((b=fis.read())!=-1){ //文件不可读会在此处出现异常
fos.write(b); //文件不可以写的会在此处出现异常
}
}finally { //加finally的原因:如果不加finally,代码在前面创建流,
try { //之后出现异常,会不执行后面关流的代码,希望关流后再停止
if(fis!=null) { //所以用finally,而finally要和try连用
fis.close(); //关流的时候也可能出现异常:流会出现关不掉
}
}finally {
if(fos!=null) {
fos.close();
}
}
}
}
IO流的标准异常处理1.7版本
public static void main(String[] args) throws IOException {
try (
FileInputStream fis = new FileInputStream("xxx.txt");
FileOutputStream fos = new FileOutputStream("yyy.txt");
){
int b;
while((b=fis.read())!=-1) {
fos.write(b);
}
}
}
因为1.7版本后,InputStream实现的Closeable接口继承了AutoCloseable接口,可以自动关闭.这种方法比较少