JAVA close关闭流最佳实践
文件流用完都要关闭,Java回收机制不会帮你关闭,如果不关闭导致垃圾越来越多,造成资源浪费,接下来谈一下关闭流的最佳实践。
第一种在try块中关闭流,不建议这样使用
import java.awt.Font;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
public class ShiYan {
public static void main(String[] args) {
// 获取系统根目录
File[] files = File.listRoots();
try {
/**
* RandomAccessFile是Java输入/输出流体系中功能丰富的文件内容访问类,它提供 了众多的方法 来访问文件内容,
* 它既可以读取文件内容,也可以向文件输出数据。
* RandomAccessFile支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读 写数据。
* "rw":以读、写方式打开指定文件。如果该文件尚不存在,则尝试创建该文件。
*
*/
RandomAccessFile randomAccessFile = new RandomAccessFile(files[2]
+ "\\h.txt", "rw");
// seek 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
randomAccessFile.seek(randomAccessFile.length());
// writeChars 按字符序列将一个字符串写入该文件。
randomAccessFile.writeChars("123");
//设置异常
//int t=2/0;
// 关闭流 不建议这样做 ,如果在关闭流上边出现异常如: int t=2/0;执行则流不会关闭,则外面还可以写入文件
randomAccessFile.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// UIManager 管理当前外观、可用外观集合、外观更改时被通知的
// PropertyChangeListeners、外观默认值以及获取各种默认值的便捷方法
// put 在开发人员默认值中存储一个对象。
UIManager.put("OptionPane.messageFont", new FontUIResource(new Font(
"宋体", Font.ITALIC, 20)));
// 弹窗提示
JOptionPane.showMessageDialog(null, files[2] + "h.txt");
}
}
第二种:在finally块写
finally块一般用来关闭物理资源(数据库连接,网络连接,磁盘文件等),这些物理资 源必须显式关闭。除非在try块、catch块中调用了退出虚拟机的方法 ( System.exit(0); ),否则不管在try块、catch块中执行怎样的代码,出现怎样的 情况,异常处理的finally块一定会被执行。
import java.awt.Font;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
public class ShiYan {
public static void main(String[] args) {
// 获取系统根目录
File[] files = File.listRoots();
RandomAccessFile randomAccessFile = null;
try {
/**
* RandomAccessFile是Java输入/输出流体系中功能丰富的文件内容访问类,它提供 了众多的方法 来访问文件内容,
* 它既可以读取文件内容,也可以向文件输出数据。
* RandomAccessFile支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读 写数据。
* "rw":以读、写方式打开指定文件。如果该文件尚不存在,则尝试创建该文件。
*
*/
randomAccessFile = new RandomAccessFile(files[2] + "\\h.txt", "rw");
// seek 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
randomAccessFile.seek(randomAccessFile.length());
// writeChars 按字符序列将一个字符串写入该文件。
randomAccessFile.writeChars("123");
// 设置异常 就算有这个异常也会关闭流
// int t=2/0;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 在finally里面写
finally {
if (randomAccessFile != null) {
try {
// 关闭流
randomAccessFile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("未关闭流");
}
}
}
// UIManager 管理当前外观、可用外观集合、外观更改时被通知的
// PropertyChangeListeners、外观默认值以及获取各种默认值的便捷方法
// put 在开发人员默认值中存储一个对象。
UIManager.put("OptionPane.messageFont", new FontUIResource(new Font(
"宋体", Font.ITALIC, 20)));
// 弹窗提示
JOptionPane.showMessageDialog(null, files[2] + "h.txt");
}
}
第三种:用Java7新特性在try加()
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
public class ShiYan {
public static void main(String[] args){
File[] roots = File.listRoots();
RandomAccessFile a =null;
try (RandomAccessFile randomAccessFile =new RandomAccessFile(roots[2]+"\\z.txt", "rw")){
randomAccessFile.seek(randomAccessFile.length());
randomAccessFile.writeChars("123");
a = randomAccessFile;
a.writeChars("222");
} catch (Exception e) {
// TODO: handle exception
}
//UIManager 管理当前外观、可用外观集合、外观更改时被通知的 PropertyChangeListeners、外观默认值以及获取各种默认值的便捷方法
//put 在开发人员默认值中存储一个对象。
UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("宋体", Font.ITALIC, 20)));
//弹窗提示
JOptionPane.showMessageDialog(null, roots[2]+"z.txt");
//测试一下流是否真的关闭,如果关闭 则会输出 流关闭了
if (a!=null) {
try {
a.writeChars("222aaa");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("流关闭了");
}
}
}
}
流的关闭,建议使用第二种,有可能有些企业,用比Java7版本低,则Java7的新特性使用不了。