2013年4月19日金曜日

Play framework Enumerator.fromFile とjava.io.File.delete の不思議

ファイルをレスポンスとして送信する処理で、一時ファイルとしてサーバーに作成し、送る前にコンテンツを読み込んで削除するってコードを書いたんだけど、(以下)


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)
fromFileってcallbackをwrapしてchunkごとにファイル読み込むから、ファイルの内容すぐにロードしなくて、実際はおくるときにbufferしてるから、先にfile.deleteするとおくれないんじゃないかって疑問わいてきて、「ひょっとしたらjava.File.deleteが待ってる?」って憶測をStackOverFlowとPlayのグループに質問したら、
多分そうなんじゃないかということなんだけど、 本当かなー? 
久々にJavaのソース読んでみるか。
fromFileはinputstreamqを中で生成してるけど、 生成しただけでFPってつかまれるんだっけな?
あと、File.deleteが非同期でエラーもはかず待つってのもうそくさいし、やっぱりfromFile時点でコンテンツロードされてて、 Resultの時にクライアントにstream送信されてるだけぽいけど、Enumeratorのコードざっとよんだかぎり、やっぱりResult時にファイル読んでる気もするし、、、うーん。
Javaのコード読んだら、追記しよう。

1 件のコメント:

  1. Javaのソースコード読んだから、 JNIでネイティブコードで実装されてるのね、、File.delete()って。libの中にそれぽい名前のsoがった。(Mac版)
    もうちょっと実験が必要だな。。

    返信削除