我需要在.txt文件中读入一个groovy类,以便逐行查询它。但我不确定我在grails应用程序中放入了哪个文件夹,以及如何获取它的路径?
到目前为止,我已尝试将其放在src
下以及新文件夹中web-app/txt
我已尝试以下内容在
中阅读fileIn = new File('/lexicon.txt').text
和
fileIn = new File('txt/lexicon.txt').text
无济于事。
任何团体都有任何指针?
答案 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可以将资源自动装配到其工件中。
请参阅以下步骤示例
grails-app/conf/
。src/groovy
grails-app/spring/resources.groovy
第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)
}
}