Java的IO操作中关闭流的注意点

一、错误示例1
 public void CopyFile()
 {
 FileReader fr = null;
 FileWriter fw = null;
 try
 {
 fr = new FileReader("c:\\xy1.txt"); // ①
 fw = new FileWriter("c:\\xy2.txt"); // ②
 char[] charBuffer = new char[1024];
 int len = 0;
 while ((len = fr.read(charBuffer)) != -1)
 {
 fw.write(charBuffer, 0, len);
 }
 System.out.println("文件复制成功");
 }
 catch (IOException e)
 {
 throw new RuntimeException("文件拷贝操作失败");
 }
 finally
 {
 try
 {
 fr.close(); // ③
 fw.close(); // ④
 }
 catch (IOException e)
 {
 throw new RuntimeException("关闭失败");
 }
 }
 }
 若①中代码出错,fr根本就没有初始化,执行③的时候就会报空指针异常。②④同样是这个道理。

Java中获取文件大小的正确方法

Java自定义类开实现四舍五入

Java多线程:一道阿里面试题的分析与应对
 

二、错误示例2
 public void CopyFile()
 {
 FileReader fr = null;
 FileWriter fw = null;
 try
 {
 fr = new FileReader("c:\\xy1.txt"); // ①
 fw = new FileWriter("c:\\xy2.txt"); // ②
 char[] charBuffer = new char[1024];
 int len = 0;
 while ((len = fr.read(charBuffer)) != -1)
 {
 fw.write(charBuffer, 0, len);
 }
 System.out.println("文件复制成功");
 }
 catch (IOException e)
 {
 throw new RuntimeException("文件拷贝操作失败");
 }
 finally
 {
 try
 {
 if (null != fr)
 {
 fr.close(); // ③
 }
 if (null != fw)
 {
 fw.close(); // ④
 }
 }
 catch (IOException e)
 {
 throw new RuntimeException("关闭失败"); // ⑤
 }
 }
 }
 加上是否为空的判断可以避免空指针异常。但是如果③执行出错,程序会直接进入⑤而④根本没有得到执行,导致无法关闭。
 
三、正确示例
 public void CopyFile()
 {
 FileReader fr = null;
 FileWriter fw = null;
 try
 {
 fr = new FileReader("c:\\xy1.txt");
 fw = new FileWriter("c:\\xy2.txt");
 char[] charBuffer = new char[1024];
 int len = 0;
 while ((len = fr.read(charBuffer)) != -1)
 {
 fw.write(charBuffer, 0, len);
 }
 System.out.println("文件复制成功");
 }
 catch (IOException e)
 {
 throw new RuntimeException("文件拷贝操作失败");
 }
 finally
 {
 try
 {
 if (null != fr)
 {
 fr.close();
 }
 }
 catch (IOException e)
 {
 throw new RuntimeException("关闭失败");
 }
 
try
 {
 if (null != fw)
 {
 fw.close();
 }
 }
 catch (IOException e)
 {
 throw new RuntimeException("关闭失败");
 }
 }
 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/57b104239901b44b47bca4103d7c5a94.html