Java的 io流( 三 )


io流中不同JDK版本捕获异常的方式(了解)
【Java的 io流】捕获异常的新格式:
try{语句..}catch{语句..}finally{语句..(这里的代码一定会执行,除非虚拟机停止)}
的特点:的代码一定被执行,除非虚拟机停止
比如说:
try里的代码没有异常,那么try执行后就会执行的代码,但是try里出现了异常,try停止执行,catch执行后,里的代码执行
这样可以使io流一定能够释放资源
异常在以后的开发中都是抛出处理的
public static void main(String[] args){FileInputStream fis=null;FileOutputStream fos=null;try {//负责原文件的读取fis=new FileInputStream("D:\\我的世界\\页面返回顶部.mp4");//负责copy文件的写出fos=new FileOutputStream("D:\\我的世界\\copy.mp4");int b;//记录读取内容//边读边写byte[]arr=new byte[1024*1024];while ((b=fis.read(arr))!=-1){//此时每一次读取的数据在数组中fos.write(arr,0,b);//这里最后一次读取可以装不满数组,// 所以要用三个参数,表示上面都多少,就写入多少}} catch (IOException e) {throw new RuntimeException(e);} finally {//由于fos和fis都是try大括号里的局部变量,//所以fos和fis的定义要放在try的外面if(fos!=null){try {fos.close();//这里的close还是有异常,用try catch包裹} catch (IOException e) {throw new RuntimeException(e);}}if (fis!=null) {try {fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
try(创建流对象1;创建流对象2){//只有实现AutoCloseable接口的类才能这样写 可能出现的异常代码;}catch(异常类名 变量名){异常的处理代码;}当catch执行完毕后,小括号里的流就会自动释放资源
创建流对象1;创建流对象2;try(流1;流2){可能出现的异常代码;}catch(异常类名 变量名){异常的处理代码;}
例子:
//jdk7public static void main(String[] args) {try (FileInputStream fis=new FileInputStream("D:\\我的世界\\页面返回顶部.mp4");FileOutputStream fos=new FileOutputStream("D:\\我的世界\\copy.mp4")){int b;//记录读取内容//边读边写byte[]arr=new byte[1024*1024];while ((b=fis.read(arr))!=-1){//此时每一次读取的数据在数组中fos.write(arr,0,b);//这里最后一次读取可以装不满数组,// 所以要用三个参数,表示上面都多少,就写入多少}} catch (IOException e) {e.printStackTrace();}}//jdk9 public static void main(String[] args) throws FileNotFoundException {FileOutputStream fos=new FileOutputStream("D:\\我的世界\\copy.mp4");FileInputStream fis=new FileInputStream("D:\\我的世界\\页面返回顶部.mp4");try (fis;fos){int b;//记录读取内容//边读边写byte[]arr=new byte[1024*1024];while ((b=fis.read(arr))!=-1){//此时每一次读取的数据在数组中fos.write(arr,0,b);//这里最后一次读取可以装不满数组,// 所以要用三个参数,表示上面都多少,就写入多少}} catch (IOException e) {e.printStackTrace();}}
字符集详解
字节流读取中文会出现乱码
ASCII字符集
0-127,一共128个字符
例如,存英文a时,先查询对应的ASCII表,得到对应值,然后转化为数字
a->97->110 0001,在前面加一个0就是八位二进制,就代表一个字节(这步是编码)
0110 0001,然后存这个二进制值存进电脑
ASCII的解码规则:
直接把二进制数转成10进制
GBK字符集
系统显示为ANSI
如果查询英文,可以直接按照ASCII来查,因为GBK完全兼容ASCII
:万国码
为什么会有乱码?
原因1:因为字节流一次只能读取一个字节,而一个中文由三个字节组成,所以读取时会产生乱码