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您的文件列表中的 s 导致问题,您可以通过以下方式摆脱它们:

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

或者,当然,首先使生成列表的东西不添加空值

编辑

实际上,听起来您有一个包含空字符串的列表...

该修复应该仍然有效,因为在 Groovy Truth 下findAll评估为空字符串false

编辑 2

作为一个快速说明,您可能可以更改:

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

至:

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

它将确保为您关闭流:-)

于 2012-05-28T09:50:41.920 回答