groovy File() 构造函数中的 GStringImpl

Posted

技术标签:

【中文标题】groovy File() 构造函数中的 GStringImpl【英文标题】:GStringImpl in groovy File() constructor 【发布时间】:2013-05-13 04:52:52 【问题描述】:

在使用GStringImpl 创建新文件对象时,我在这里遇到了一个奇怪的错误。如果我使用GStringImpl 创建一个新文件(然后列出该路径中的文件),我会得到一个空数组,并且没有错误,但是如果我只是一个普通字符串,我会得到一个文件列表......虽然那个在某种程度上是有道理的,我认为某处会出现错误。

例子:

def thisIsAListOfFiles = new File("/absolute/fs/mount/point").listFiles()

def gString = "$StaticClass.propertyStringThatIsAnAbsoluteFilePath"
def notAListOfFiles = new File(gString).listFiles()

对这里发生的事情有什么想法吗?这是预期的行为吗?

更多信息:

Groovy 版本:2.1.3 Grails 版本:2.2.2(当然这是在 grails 应用程序中) Java 版本:OpenJDK 运行时环境 (IcedTea 2.3.9)

我从一个包含一堆这样的属性的属性文件开始

com.mycompany.property = "/absolute/directory/path"

因为我不能轻易地将grailsApplication 注入到非 grails 类中(例如 /src/groovy 中的任何东西),所以我将 grailsApplication 注入到引导程序中,并使用 groovy config slurper 从类路径中读取属性文件,然后将其设置为静态groovy 类 Config.groovy 中的字符串值。然后,该 groovy 类具有我在应用程序中任何位置所需的所有属性的静态变量。

注意:这不是读取属性文件或任何类似内容的问题。我在new File(var).listFiles() 发生之前记录了Config.filePathProperty,并且该值设置正确。

【问题讨论】:

【参考方案1】:

我很确定您的静态路径设置不正确。我运行了以下代码作为测试:

String path = '/etc/'

print "String ($path): "
println(new File(path).listFiles().size())

def gpath = "$path"

print "GString ($gpath): "
println(new File(gpath).listFiles().size())

class Foo 
    static String path = '/etc/'


print "GString static ($Foo.path): "
println(new File("$Foo.path").listFiles().size())

得到了这个结果(显然你的文件数会有所不同):

String (/etc/): 122
GString (/etc/): 122
GString static (/etc/): 122

我看到null结果的唯一一次是路径无效时,例如:

assert new File("does-not-exist").listFiles() == null

您可以做的一件事是消除 GString,这在您的示例中是不必要的:

def notAListOfFiles = new File(StaticClass.propertyStringThatIsAnAbsoluteFilePath).listFiles()

但我相信您会发现变量或文件路径中的拼写错误,或其他类似问题。

【讨论】:

抱歉回复太长了。你是对的,我太累了,太缺乏精神了,无法正确思考。我正在“正确”设置路径,因为它是正确的绝对路径,但是我使用 java 属性的方式是错误的。它是key=value 而不是key="quoted values are wrong..."。所以谢谢。 log.info 和 println 当然显示了这一点,但我完全错过了这一点,因为我倾向于在日志语句中引用一些 var...

以上是关于groovy File() 构造函数中的 GStringImpl的主要内容,如果未能解决你的问题,请参考以下文章

Groovy 将代码添加到构造函数

空检查构造函数参数的Groovy方式

Groovy循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(代

重写构造函数中调用的方法时,Groovy metaClass 失败?

我可以在 groovy 中使用映射强制来模拟具有带参数的构造函数的类吗?

groovy-file2