2013-03-13 163 views
21

我需要將.txt文件讀入Groovy類,以逐行詢問它。但我不確定我的Grails應用程序中放入了什麼文件夾,以及如何獲取它的路徑?將文本文件放入Grails中的位置以及如何獲取路徑

到目前爲止,我已經嘗試將其置於src,並在一個新的文件夾web-app/txt

,我曾嘗試下面的

fileIn = new File('/lexicon.txt').text 

fileIn = new File('txt/lexicon.txt').text 

讀它無濟於事。

任何機構有任何指針?

回答

30

Grails是一個Java Web應用程序,因此它將被編譯成一個單文件文件.war,其中包含所有文件/類/ etc。大多數Web容器都會解壓縮war,但沒有任何擔保人,因此使用File作爲文件訪問此文件並不是一個好主意。

順便說一句,您可以將文件放入grails-app/conf,在這種情況下,將被放置到classpath,你就可以通過訪問它:

InputStream lexicon = this.class.classLoader.getResourceAsStream('lexicon.txt') 

你也可以把這個文件到一個子目錄,如grails-app/conf/data並將其加載爲***.getResourceAsStream('data/lexicon.txt')

+3

IMO放雜項。 conf目錄下的文件不是一個完美的主意。 – dnim 2013-09-14 09:12:07

+3

它不僅僅是一個「misc。file」,它最可能是一個配置工件 – 2013-09-14 09:21:35

+1

如果文件被放入src/main/resources,那麼它們可以完全按照上面的方式訪問。 String fileNameAndPath = this.class.classLoader.getResource(「actualFileName.txt」)。getFile() – Ask613 2016-08-31 13:03:00

11

您可以使用Spring的資源加載來訪問該文件。使用這種方法,您可以從Spring bean訪問該文件,這意味着Grails可以將資源自動裝入其工件。

下面參見下面的步驟的示例

  1. 放置在grails-app/conf/該文件。
  2. 做一個資源持有者類src/groovy
  3. 添加資源持有者作爲一個Spring bean在grails-app/spring/resources.groovy
  4. 然後自動裝配和使用資源,無論你需要它

第2步:

package resource 

import org.springframework.core.io.Resource 

class ResourceHolder { 
    Resource lexicon 
} 

第3步:

beans = { 
    lexiconHolder(resource.ResourceHolder) { 
     lexicon = 'classpath:lexicon.txt' 
    } 
} 

第4步:

class AnyGrailsService { 
    def lexiconHolder 

    void aMethodUsingTheLexicon() { 
     File lexicon = lexiconHolder.lexicon.file 

     /* Do stuff with the lexicon */ 
    } 
19

你可以把你的文件下的web應用程序/

例子:

web-app/lexicon.txt 

然後在您的控制器或服務使用grailsApplication:

class MyService { 
    def grailsApplication 
    public myMethod() { 
     File myFile = grailsApplication.mainContext.getResource("lexicon.txt").file 
    } 
} 

希望這會有幫助

7

Grails中2,你可以使用Grails資源定位器

class MyService { 
    def grailsResourceLocator 

    myMethod() { 
     def fileIn = grailsResourceLocator.findResourceForURI('/txt/lexicon.txt').file 
    } 
} 

方便的技巧:在斯波克嘲笑這一點,使用GroovyPageStaticResourceLoader

@TestFor(MyService) 
class MyServiceSpec extends Specification { 
    def setup() { 
     service.grailsResourceLocator = Mock(GroovyPageStaticResourceLocator) 
    } 
}