Достаточно ли закрыть канал или нужно также закрыть RandomAccessFile

Я работаю над некоторыми отчетами Sonar Qube и исправляю вещи там, где это необходимо. Шаблон, который некоторые коллеги использовали для доступа к файлам, заключается в создании RandomAccessFile экземпляр и получить Channel от него. Этот канал может быть возвращен к вызывающему коду - чья обязанность - закрыть его. Проблема в том, что при возврате канала невозможно закрыть RandomAccessFile объект, который его создал - так жалуется гидролокатор.

Это нормально, чтобы закрыть Channel и игнорировать RandomAccessFile, Я посмотрел на RandomAccessFile#close() метод и может видеть, что он закроет канал, но обратное неверно.

Другим похожим примером будет класс, который создает канал из new RandomAccessFile(...) а позже в другом методе закрывает Channel но не сохранил ссылку на RandomAccessFile, Следует ли изменить код, чтобы в нем было поле, указывающее на файл, и закрыть его вместо этого? Или это не имеет значения?

1 ответ

Решение

В документации API это не указано явно, что может означать, что гарантии нет.

Однако при условии Channel это FileChannelзатем канал закрывается implCloseChannel метод. Глядя на реализацию, родитель закрывается, если это экземпляр Closeable,

Другие вопросы по тегам