Нужно ли определять двоичный объект отдельно, поэтому я могу позвонить ему .dispose();
(см. methodOne()
) или будет обрабатываться автоматически при автоматическом закрытии InputStream (см. methodTwo()
)?Мне нужно вызвать оба .dispose() (javax.jcr.Binary) и .close() (java.io.InputStream)?
private void methodOne(Resource resource) {
Binary binary = resource.getValueMap().get("jcr:data", Binary.class);
try {
InputStream is = null;
try {
is = binary.getStream();
// ...do something with the InputStream...
} catch (RepositoryException e) {
LOG.error("RepositoryException trying to get an InputStream from the resource.");
} finally {
if (is != null) {
IOUtils.closeQuietly(is);
}
}
} finally {
binary.dispose();
}
}
private void methodTwo(Resource resource) {
try (InputStream is = resource.getValueMap().get("jcr:data", Binary.class).getStream()) {
// ...do something with the InputStream...
} catch (IOException e) {
LOG.error("IOException from trying to auto-close InputStream.");
} catch (RepositoryException e) {
LOG.error("RepositoryException trying to get an InputStream from the resource.");
}
}
Я действительно путают о том, как даже проверить, если анонимный Binary ресурс в настоящее время methodTwo утилизированы должным образом, поэтому я даже задавать этот вопрос в первую очередь.
Большое спасибо за разъяснение по обработке IOException, а также быстрый ответ! javax.jcr.Binary не расширяет Closeable или AutoCloseable, поэтому объявление в объявлении try-with-resources не обязательно будет обрабатывать вызов '.dispose();' хотя, правильно? – Gdubz
@gdubz: Извините, моя ошибка, я предположил, что это «AutoCloseable». Одна секунда ... –
Все в порядке. Читая комментарии в классе, похоже, что я отвечаю за вызов как .close() 'на InputStream, так и' .dispose() 'на самом двоичном объекте. Я просто не понимаю последствия вызова '.getStream()' от прикованной инициализации (думаю, оставляю там анонимный двоичный объект?) Или как даже тестировать/отлаживать это. – Gdubz