首页 文章

Groovy File()构造函数中的GStringImpl

提问于
浏览
0

在使用 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 注入bootstrap,并使用groovy config slurper从类路径中读取属性文件,然后在groovy类中将其设置为静态字符串值Config.groovy . 那个groovy类然后在应用程序的任何地方都有我需要的所有属性的静态变量 .

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

1 回答

  • 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()
    

    但我相信你会在变量或文件路径或其他类似问题中找到拼写错误 .

相关问题