我有一个从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表现得像这样,我该怎么做呢?
答案 0 :(得分:11)
没有,所以我假设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 ) )
...
当然,让生成List的东西首先不添加空值
实际上,听起来你有一个带有空字符串的List ......
findAll
修补程序仍然可以正常工作,因为在Groovy Truth下空字符串计算为false
快速说明一下,你可能会改变:
def fos = new FileOutputStream( new File( targetDir, filename ) )
...
为:
new File( targetDir, filename ).withOutputStream { fos ->
...
它会ensure the stream is closed给你: - )