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的新特性使用不了。