2013-03-13 167 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) 
    } 
}