8

空のコレクションが供給されることがあるWebサーバーからファイルをダウンロードする機能があります。私がそのコレクションでそれぞれを呼び出す関数では、関数が終了し、各クロージャーがまったく実行されないことが予想されます。問題は、空のfilenameパラメーターで実行され、ファイルではなくディレクトリがフィードされると、FileOutputStreamの作成がブームになることです。

def get(String baseUrl, List files, String targetDir) {
    files.each { filename ->
    // Goes BOOM on next line
    def fos = new FileOutputStream(targetDir + File.separator + filename)
    ...
}

Groovyがこのように動作するのはなぜですか?代わりに何をすべきですか?

4

1 に答える 1

10

そうではないので、files何かが含まれていると思います(null?)

[].each {
  println "boom"  // This doesn't appear
}

[null].each {
  println "pow!"  // this does
}

問題の原因がファイルリストにあると仮定するとnull、次の方法でそれらを取り除くことができます。

files.findAll().each { filename ->
  def fos = new FileOutputStream( new File( targetDir, filename ) )
  ...

またはもちろん、リストを生成するものが最初にnullを追加しないようにします

編集

実際には、空の文字列を含むリストがあるようです...

空の文字列はGroovyTruthの下でfindAll評価されるため、修正は引き続き機能します。false

編集2

簡単なメモとして、おそらく変更することができます:

def fos = new FileOutputStream( new File( targetDir, filename ) )
...

に:

new File( targetDir, filename ).withOutputStream { fos ->
  ...

そしてそれはあなたのためにストリームが閉じられることを保証します:-)

于 2012-05-28T09:50:41.920 に答える