2013-04-17 2 views
3

Я написал файл перенося код следующим образом:Почему этот код успешно работает с Enumerator.fromFile?

val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file) 
val size = file.length.toString 
file.delete // (1) THE FILE IS TEMPORARY SO SHOULD BE DELETED 
SimpleResult(
header = ResponseHeader(200, Map(CONTENT_LENGTH -> size, CONTENT_TYPE -> "application/pdf")), 
body = fileContent) 

Этот код работает успешно, даже если размер файла достаточно велик (2,6 MB), но я смущен, потому что я понимаю, о .fromFile() является оберткой fromCallBack(), а SimpleResult фактически считывает файл с буфером, но до этого файл удаляется.

МОЖЕТ БЫТЬ ПРЕДУПРЕЖДЕНИЕ, что java.io.File.delete ждет, пока файл не будет освобожден после завершения чтения фрагмента, но я никогда не слышал об этом процессе класса Java File, Или .fromFile() уже загружен все строки в экземпляре Enumerator, но это противоречит спецификации fromCallBack(), я думаю.

Кто-нибудь знает об этом механизме?

ответ

2

Я предполагаю, что вы находитесь на какой-то системе Unix, OSX или Linux, например.

В системе Unix: y вы можете фактически удалить открытый файл, любая запись файловой системы - это просто ссылка на фактический файл, а также дескриптор файла, который вы получаете при открытии файла. Содержимое файла не будет недоступно/удалено до тех пор, пока последняя ссылка на него не будет удалена.

Итак: он больше не будет отображаться в файловой системе после того, как вы сделаете file.delete, но вы все равно можете прочитать его с помощью InputStream, который был создан в Enumerator.fromFile (файл), так как это создало дескриптор файла. (В Linux вы действительно можете найти его через специальную файловую систему proc, которая, помимо всего прочего, содержит дескрипторы файлов для каждого запущенного процесса)

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

Смежные вопросы