在Grails中放置文本文件的位置,以及如何获取路径

时间:2013-03-13 15:19:56

标签: java file grails inputstream

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

到目前为止,我已尝试将其放在src下以及新文件夹中web-app/txt

我已尝试以下内容在

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

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

无济于事。

任何团体都有任何指针?

4 个答案:

答案 0 :(得分:33)

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

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

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

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

答案 1 :(得分:21)

您可以将文件放在web-app /

示例:

web-app/lexicon.txt

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

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

希望这有帮助

答案 2 :(得分:11)

您可以使用Spring的资源加载来访问该文件。使用此方法,您可以从Spring bean访问该文件,这意味着Grails可以将资源自动装配到其工件中。

请参阅以下步骤示例

  1. 将文件放在grails-app/conf/
  2. src/groovy
  3. 中创建资源持有者类
  4. grails-app/spring/resources.groovy
  5. 中将资源持有者添加为Spring bean
  6. 然后自动装配并在任何需要的地方使用资源
  7. 第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 */
        }
    

答案 3 :(得分: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)
    }
}