:)
IO流资源释放3.1 JDK7以前的资源释放在JDK7版本以前我们可以使用try...catch...finally语句来处理。格式如下:try{// 有可能产生异常的代码}catch(异常类 e){// 处理异常的代码}finally{// 释放资源的代码// finally里面的代码有一个特点无论try中的程序是正常执行了还是出现了异常最后都一定会执行finally区除非JVM终止。// 作用一般用于在程序执行完成后进行资源的释放操作专业级做法}public class FinallyTest { public static void main(String[] args) { try { System.out.println(10 / 2); // System.out.println(10 / 0); // return; // 跳出方法的执行 finally也会执行 // System.exit(0); // 只要终止虚拟机finally就不再执行了 } catch (Exception e) { e.printStackTrace(); } finally { System.out.println(-------finally-------); } // 思考: 如果不添加finally 放在try...catch...外边是否可以呢? 一旦出现return就不行了 // System.out.println(-------Finally-------); System.out.println(chu(10, 5)); } public static int chu(int a, int b){ try { return a / b; } catch (Exception e){ e.printStackTrace(); return -1; // 代表的是出现异常 } finally { // 千万不要在finally中返回数据 // return 111; } } }改造上面的代码public class CopyDemo1 { public static void main(String[] args) { // 需求复制照片。 InputStream is null; OutputStream os null; try { // 1、创建一个字节输入流管道与源文件接通 is new FileInputStream(D:/resource/meinv.png); // 2、创建一个字节输出流管道与目标文件接通。 os new FileOutputStream(E:/data//meinv.png); System.out.println(10 / 0); // 3、创建一个字节数组负责转移字节数据。 byte[] buffer new byte[1024]; // 4、从字节输入流中读取字节数据写出去到字节输出流中。读多少写出去多少。 int len; while ((len is.read(buffer)) ! -1){ os.write(buffer, 0, len); } System.out.println(复制完成); } catch (IOException e) { throw new RuntimeException(e); } finally { /** * 在释放资源时需要考虑两个问题: * 1. 在try代码块中是否存在关闭流的情况 * 2. 在创建流对象时是否存在异常的情况 */ try { if (os ! null) os.close(); } catch (IOException e) { throw new RuntimeException(e); } try { if (is ! null) is.close(); } catch (IOException e) { throw new RuntimeException(e); } } } }3.2 JDK7以后的资源释放格式如下try(资源对象1; 资源对象2;){可能出现异常的代码;}catch(异常类 e){处理异常的代码}() 中只能放置资源否则报错什么是资源呢资源一般指的是最终实现了AutoCloseable接口。public abstract class InputStream implements Closeable{ }public abstract class OutputStream implements Closeable, Flushable { }public interface Closeable extends AutoCloseable { }//注意这里没有释放资源的代码。该资源使用完毕后会自动调用其close()方法完成对资源的释放/** * 目标掌握释放资源的方式try-with-resource */ public class CopyDemo2 { public static void main(String[] args) { // 需求复制照片。 try ( // 1、创建一个字节输入流管道与源文件接通 InputStream is new FileInputStream(D:/resource/meinv.png); // 2、创建一个字节输出流管道与目标文件接通。 OutputStream os new FileOutputStream(E:/data//meinv.png); ){ // 3、创建一个字节数组负责转移字节数据。 byte[] buffer new byte[1024]; // 4、从字节输入流中读取字节数据写出去到字节输出流中。读多少写出去多少。 int len; // 记住每次读取了多少个字节。 while ((len is.read(buffer)) ! -1){ os.write(buffer, 0, len); } System.out.println(复制完成); } catch (IOException e) { throw new RuntimeException(e); } } }四、字符流4.1 FileReader类FileReader读取文件的步骤如下第一步创建FileReader对象与要读取的源文件接通 第二步调用read()方法读取文件中的字符 第三步调用close()方法关闭流/** * 目标掌握文件字符输入流。 */ public class FileReaderTest { public static void main(String[] args) { try ( // 1、创建一个文件字符输入流管道与源文件接通 Reader fr new FileReader(day11_io\\src\\sy01.txt); ){ // 2、一个字符一个字符的读性能较差 /*int len; // 记住每次读取的字符编号。 while ((len fr.read()) ! -1){ System.out.print((char) len); }*/ /** * 每次读取一个字符的形式性能肯定是比较差的。 * 3、每次读取多个字符。性能是比较不错的 */ char[] buffer new char[3]; int len; // 记住每次读取了多少个字符。 while ((len fr.read(buffer)) ! -1){ // 读取多少倒出多少 String str new String(buffer, 0, len); System.out.print(str); } } catch (Exception e) { e.printStackTrace(); } } }4.2 FileWriter类FileWriter往文件中写字符数据的步骤如下第一步创建FileWirter对象与要读取的目标文件接通 第二步调用write(字符数据/字符数组/字符串)方法读取文件中的字符 第三步调用close()方法关闭流/** * 目标掌握文件字符输出流写字符数据出去 */ public class FileWriterTest { public static void main(String[] args) { try ( // 0、创建一个文件字符输出流管道与目标文件接通。 // 覆盖管道 //Writer fw new FileWriter(day11_io\\src\\sy02.txt); // 追加数据的管道 Writer fw new FileWriter(day11_io\\src\\sy02.txt, true); ){ // 1、写一个字符出去 fw.write(a); fw.write(97); //fw.write(东); // 写一个字符出去 fw.write(\r\n); // 换行 // 2、写一个字符串出去 fw.write(我爱你中国abc); fw.write(\r\n); // 3、写字符串的一部分出去 fw.write(我爱你中国abc, 0, 5); fw.write(\r\n); // 4、写一个字符数组出去 char[] buffer {胜, 雅, a, b, c}; fw.write(buffer); fw.write(\r\n); // 5、写字符数组的一部分出去 fw.write(buffer, 0, 2); fw.write(\r\n); } catch (Exception e) { e.printStackTrace(); } } }