У меня проблема в моей программе. моя java-программа, которая действует как веб-служба (построенная на основе искры), выдает исключение IOException под названием «Слишком много открытых файлов», хотя я обращаюсь только к одному файлу в своем приложении и использую попытку с ресурсом, который в конечном итоге закроет файл .. это немного кода, где я обращаюсь к файлу:
public synchronized JSONObject read() {
if (jsonObject == null) {
LOGGER.info("Reading a json file");
String line = "";
final StringBuilder sb = new StringBuilder();
try (FileReader fr = new FileReader("..path../sample.json");
BufferedReader br = new BufferedReader(fr)) {
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
LOGGER.info(e.getMessage());
}
jsonObject = new JSONObject(sb.toString());
}
return jsonObject;
}
здесь jsonObject, конечно, является переменной экземпляра. когда я запускаю это приложение и нажимаю что-то через почтальона, он вызывает блок «если» только один раз, хотя для каждого запроса требуются данные из файла sample.json (так что это было действительно то, что я ожидал, т. е. должен читать только файл один раз).. но через некоторое время мой сервер, на котором было развернуто это приложение, падает с вышеупомянутым IOException. я пробовал много серфинга, до сих пор не повезло найти решение.
ОТРЕДАКТИРОВАНО:
Это трассировка стека:
[qtp1477164349-12-acceptor-0@5ef8508f-ServerConnector@503fa520{HTTP/1.1,[http/1.1]}{0.0.0.0:4567}] WARN org.eclipse.jetty.server.AbstractConnector -
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
at org.eclipse.jetty.server.ServerConnector.accept(ServerConnector.java:379)
at org.eclipse.jetty.server.AbstractConnector$Acceptor.run(AbstractConnector.java:638)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)