본문

[Java] BufferedReader close() 를 사용해야하는 이유

반응형

1. 이슈

traceroute 로직을 수행후, bufferreader close 구문이 없다.

traceroute를 여러번 실행하면 traceroute가 실행이 안됨 정상적인 기능을 사용하기 위해 서비스를 재시작 해야한다.

@Override
public String traceroute(List<String> commands) throws Exception {
	String str = "";
	String cmdResult = "";
	
	ProcessBuilder pb = new ProcessBuilder(commands);
	Process process = pb.start();
	BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));

	String fullName = "";
	for (String s: commands) {
		fullName = fullName + " " + s;
	}

	try {
		while ((str = stdInput.readLine()) != null)
			cmdResult += str + "\n";

		if (cmdResult == "") {
			log.debug("Network is unreachable");
			cmdResult = "FAIL";
			return cmdResult;
		}
	} catch (Exception e) {
		log.error("Exception occurred in traceroute : " + e,e);
	}
	
	return cmdResult;
}

 

 

2. 조치

bufferreader close를 하는 finally 구문 추가

...

} finally {
	try {
		if (stdInput != null) stdInput.close();
	}
	catch (IOException e) {}
}

 

 

BufferedReader 의 경우 close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리됩니다. 즉 BufferedReader의 경우, close()를 콜해주지 않아도 문제는 없습니다.  Garbage Collector에 의하여 사용되지않는 자원이 정리되기 전에 연속/반복적으로 BufferedReader가 close 되지않고 사용되면 정상적으로 reading이 되지지 않습니다.

 

 

 

 

 

💡 BufferedReader, BufferedWriter 알아보기: https://server-engineer.tistory.com/848

 

반응형

공유

댓글