如何花式关闭IO流

讨论如何关闭IO流,那么我们必须先知道为什么需要关闭: 

因为在创建IO流的时候,我们默认会将其指向一个端口或一个文件,而此时的IO流会锁定对应端口和文件,导致其无法被操作(比如写入或读取),因此,必须在IO流的操作中,实现IO流的关闭。


在创建流中,如果我们有需求创建了多种IO流的时候,那么正常操作中,我们需要在finally中,分别对每个流的关闭进行一次try-catch操作,保证关闭时候每一个IO流的异常都被准确地定位和捕获,只有这样,才能保证所有IO流能被稳定地关闭。

正确示范:

1、在try-catch后的finally代码块中依次进行关闭。

2、关闭顺序:

  1. 先创建的IO流后关闭,后创建的IO流先关闭(先进后出,后进先出)
  2. 依赖别人的IO流先关闭,被依赖的IO流后关闭(有感情妄想的先受伤)
public static void main(String[] args) {

//  创建对应的IO流,并建立依赖关系
	InputStreamReader inputStreamReader =
			new InputStreamReader(System.in);
	OutputStreamWriter outputStreamWriter =
			new OutputStreamWriter(System.out);
	BufferedWriter bufferedWriter =
			new BufferedWriter(outputStreamWriter);
	BufferedReader bufferedReader =
			new BufferedReader(inputStreamReader);

//  在try中进行操作
//  通过命令行读取字符串
//  直至读取到exit的时候退出程序
	try {
		String str = "";
		while( !str.equals("exit") ) {
			str = bufferedReader.readLine();
			bufferedWriter.write(str);
			bufferedWriter.flush();
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {                                //在finally中,对创建的流进行关闭
		try {                                  //顺序参照:
			inputStreamReader.close();         //1、先创建的后关闭,后创建的新关闭
		} catch (IOException e) {              //2、依赖别人的先关闭,被依赖的后关闭
			e.printStackTrace();
		}
		try {
			outputStreamWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			bufferedReader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			bufferedWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

而在实际操作过程中,往往我们会犯以下几种错误,导致IO流未能正确关闭:

错误示范一:

因为偷懒而在一个finally中的try-catch完成所有IO流的关闭。

finally {
	try {
		inputStreamReader.close();
		outputStreamWriter.close();
		bufferedReader.close();
		bufferedWriter.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

错误示范二:

直接在try-catch中关闭了IO流。

try {
	String str = "";
	while( !str.equals("exit") ) {
		str = bufferedReader.readLine();
		bufferedWriter.write(str);
		bufferedWriter.flush();
	}
	inputStreamReader.close();
	outputStreamWriter.close();
	bufferedReader.close();
	bufferedWriter.close();
} catch (IOException e) {
		e.printStackTrace();
}

如何花式关闭IO流

当我们如上面的程序一般,一次性创建多个IO流的时候,难免会在关闭的时候需要对诸多IO流依次进行关闭,并且难免会出现顺序错误的问题。

其实官方提供了一种很方便的方法,我们只需要在try后的括号中,进行IO流的创建,那么在try结束后,便会自动帮我们进行IO流的关闭啦。

如下所示,通过这种方法关闭IO流,可以极大地减少代码量。

public static void main(String[] args) {
	try(InputStreamReader inputStreamReader =
				new InputStreamReader(System.in);
		OutputStreamWriter outputStreamWriter =
				new OutputStreamWriter(System.out);
		BufferedWriter bufferedWriter =
				new BufferedWriter(outputStreamWriter);
		BufferedReader bufferedReader =
				new BufferedReader(inputStreamReader);) {
		String str = "";
		while( !str.equals("exit") ) {
			str = bufferedReader.readLine();
			bufferedWriter.write(str);
			bufferedWriter.flush();
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

你可能感兴趣的:(Java,java)