2013-05-17 26 views
0

當我用GStringImpl創建一個新的文件對象時,我遇到了一些奇怪的錯誤。如果我用GStringImpl創建一個新的文件(然後列出那個路徑中的文件),我得到一個空數組,並且沒有錯誤,但是如果我只是一個普通的字符串,我會得到一個文件列表...雖然這是有道理的在某種程度上,我會認爲某處會出現錯誤。Groovy中的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的運行時環境(2.3的IcedTea 0.9)

我開始了一個屬性,像這樣

com.mycompany.property = "/absolute/directory/path" 
一堆屬性文件

因爲我不能輕鬆地將grailsApplication到非Grails的類(在/src/groovy比如什麼)我注入grailsApplication爲引導,並使用常規配置slurper讀屬性從classpath文件和設置,則靜態字符串值在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() 

但我相信你會在變量或文件路徑或其他類似問題中發現錯字。

+0

對不起,長答覆。你是對的,我太累了,也沒有經過正確的思考。我正在設置路徑「正確」,因爲它是正確的絕對路徑,但我使用java屬性的方式是錯誤的。它是'key = value'不'key =「引用的值是錯誤的......」'。所以謝謝。 log.info和println顯示了這一點,但我完全錯過了,因爲我傾向於在日誌語句中引用某些var的某些時間... –