In the class org.apache.jasper.compiler.JDTCompiler: ------------------------------------------------------------------------- public char[] getContents() { char[] result = null; try { InputStreamReader isReader = new InputStreamReader(new FileInputStream(sourceFile), ctxt.getOptions().getJavaEncoding()); Reader reader = new BufferedReader(isReader); if (reader != null) { char[] chars = new char[8192]; StringBuffer buf = new StringBuffer(); int count; while ((count = reader.read(chars, 0, chars.length)) > 0) { buf.append(chars, 0, count); } result = new char[buf.length()]; buf.getChars(0, result.length, result, 0); } } catch (IOException e) { log.error("Compilation error", e); } return result; } ------------------------------------------------------------------------- the variable "reader" is not closed after use it. if I update jsp files frequently, it will exhaust the system file handler. "too many files" errors will come. I test it on Redhat linux, the same problem will occured in tomcat 5 and tomcat 6.
Both the FileInputStream and the InputStreamReader should be closed within a finally block.
Only the FileInputStream needs to be closed (the others are irrelevant).