본문
[Java] BufferedReader close() 를 사용해야하는 이유
프로그래밍/Java 2018. 4. 9. 09:01
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
댓글