26

我需要将 .txt 文件读入一个 groovy 类,以便逐行询问它。但我不确定我将它放入我的 grails 应用程序中的哪个文件夹,以及如何获取它的路径?

到目前为止,我已经尝试将它放在一个新文件夹下src和一个新文件夹中web-app/txt

我已经尝试了以下内容来阅读它

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

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

无济于事。

任何机构有任何指针?

4

4 回答 4

38

Grails 是一个 Java Web 应用程序,因此它将被编译成一个文件.war,其中包含所有文件/类/等。大多数 Web 容器都会 unpack war,但没有任何保证,因此将File这个文件作为文件来访问并不是一个好主意。

顺便说一句,您可以将文件放入grails-app/conf中,在这种情况下,它将放入classpath中,您可以使用以下命令访问它:

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

您也可以将此文件放入子目录中,例如grails-app/conf/data并将其加载为***.getResourceAsStream('data/lexicon.txt')

于 2013-03-13T15:29:00.867 回答
22

你可以把你的文件放在 web-app/

例子:

web-app/lexicon.txt

然后在您的控制器或服务中使用 grailsApplication:

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

希望这可以帮助

于 2013-03-14T01:32:35.167 回答
12

您可以使用 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 */
    }
于 2013-03-13T16:10:01.837 回答
7

在 Grails 2 中,您可以使用 Grails 资源定位器

class MyService {
    def grailsResourceLocator

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

实用提示:要在 Spock 中模拟它,请使用 GroovyPageStaticResourceLoader

@TestFor(MyService)
class MyServiceSpec extends Specification {
    def setup() {
        service.grailsResourceLocator = Mock(GroovyPageStaticResourceLocator)
    }
}
于 2014-08-20T18:08:37.707 回答