Замкнуты ли блокировки Java FileChannel, когда соответствующий поток закрыт, или я должен явно их закрыть? - PullRequest
4 голосов
/ 29 декабря 2010

Например, мой код выглядит примерно так: Нужно ли явно вызывать lock.release или он автоматически освобождается при закрытии FileOutputStream?

var os:FileOutputStream = null
var writer:PrintWriter = null
try {
  os = new FileOutputStream(name, false)
  val lock = os.getChannel().tryLock
  if(lock != null) {
    writer = new PrintWriter(new BufferedWriter(new
      OutputStreamWriter(os)))
    (write stuff to file)
  } else {
    (error stuff)
  }
} finally {
  if(writer != null) writer.close
  os.close
}

Ответы [ 3 ]

5 голосов
/ 29 декабря 2010

Согласно javadoc для FileLock :

"Объект блокировки файла изначально действителен. Он остается действительным до тех пор, пока блокировка не будет снята путем вызова метода освобождения, закрытия канала, который использовался для его получения, или путем завершения виртуальной машины Java. в зависимости от того, что наступит раньше. "

... и я предполагаю, что закрытие потока закрывает основной канал.

4 голосов
/ 29 декабря 2010

Вообразил, что это будет выпущено, но мне было любопытно, что я проверил это в блоке finally:

println("Lock: " + lock.isValid)
if (writer != null) writer.close
println("Lock: " + lock.isValid)
os.close
println("Lock: " + lock.isValid)

И это был результат:

Lock: true
Lock: false
Lock: false

Кажетсяпочисти, когда закроешь писателя.

0 голосов
/ 27 декабря 2017

Этот вопрос возник, когда я погуглил с тем же сомнением.

Не найдя абсолютного ответа, я провел несколько тестовых тестов.

Я могу подтвердить, что да, простое закрытие писателя снимет блокировки.Вам даже не нужно вручную закрывать поток, который находится под записывающим устройством.

Как я тестировал:

1) Я запускаю код в Eclipse в режиме debug .2) После записи и сброса в файл (перед закрытием) я попытался удалить файл с помощью проводника Windows.Как и ожидалось, это не удалось из-за блокировки.3) Как только я прошел через метод writer.close (), но перед завершением запуска я снова попытался удалить файл.Он удалил его без проблем.

Это ясно говорит мне, что метод close () приведет к снятию блокировок.

ПРИМЕЧАНИЕ. Выше указано только для класса File JDK.Библиотеки, которые расширяют java.io.File, могут вести себя по-разному.Например, если вы используете iSeries IfsJavaFile, у вас будет утечка памяти соединения, если только вы не освободите специфичный для iSeries объект соединения с сервером.

...