Томкат работает с огромным количеством файлов.
Он открывает файл, берет всё его содержимое и записывает в String следующим образом:
Files.lines(Paths.get(path), Charset.forName("UTF-8")).reduce("", String::concat)
Файлов несколько сотен, а также, возможно, каждый открывается неоднократно.
Увеличение лимитов количества открытых файлов через ulimit -n
, прописывание в /etc/security/limits.conf
и прочее мне не подходит: нет необходимости в том, чтобы было открыто огромное количество файлов сразу.
Вопрос: как мне "закрывать" файл сразу, как только его содержимое записывается в строку? У меня есть метод, выглядит он так:
String getStringFromFile(String path){
String answer = "";
try {
path = URLDecoder.decode(path, "UTF-8");
answer = Files.lines(Paths.get(path), Charset.forName("UTF-8")).reduce("", String::concat);
} catch (Exception e) {
e.printStackTrace();
}
return answer;
}
То есть сам файл меня не волнует вообще, мне нужно лишь его содержимое, которое после открытия записывается в строку - и всё. Как тут же закрывать файл, или как мне добиться того же результата (записи всего содержимого файла в одну строку), при этом, чтобы все файлы не накапливались открытыми?
Надо закрыть stream, который использует ресурсы ввода/вывода. Stream реализует AutoCloseable, можно воспользоваться try-with-resource
:
...
try (Stream<String> stream = Files.lines(Paths.get(path), Charset.forName("UTF-8"))) {
answer = stream.reduce("", String::concat);
}
...
Или самостоятельно закрывать вызовом stream.close()
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
При попытке преобразовать массив строк на массив чисел бросается исключение ArrayIndexOutOfBounds ExceptionКак нужно избежать этого? Вот сам код:
Есть проблема - я написал веб сервис, клиент которого адекватно генерил заглушки, и каким то образом перестал это делатьНаписан сервер, рабочий...
Исключение при добавлении записи в БД:
ПриветствуюПодскажите, почему второй вариант кода не принимает компилятор? В чем разница?