Где поместить текстовый файл в Grails и как получить путь
Мне нужно прочитать в .txt файле в классе groovy для того, чтобы опросить его по строкам. Но я не уверен, какую папку я вложил в мое приложение grails, и как получить путь к нему?
До сих пор я попытался разместить его под src
, а также в новой папке web-app/txt
и я попробовал следующее прочитать его в
fileIn = new File('/lexicon.txt').text
и
fileIn = new File('txt/lexicon.txt').text
безрезультатно.
Любое тело имеет какие-либо указатели?
Ответы
Ответ 1
Grails - это веб-приложение Java, поэтому оно будет скомпилировано в файл sigle .war
со всеми файлами/классами и т.д. внутри. Большинство веб-контейнеров распаковывают war
, но нет никаких гарантий, поэтому не рекомендуется использовать File
для доступа к этому файлу в виде файла.
Btw, вы можете поместить свой файл в grails-app/conf
, в этом случае он будет помещен в classpath
, и вы сможете получить к нему доступ, используя:
InputStream lexicon = this.class.classLoader.getResourceAsStream('lexicon.txt')
Вы также можете поместить этот файл в подкаталог, например grails-app/conf/data
, и загрузить его как ***.getResourceAsStream('data/lexicon.txt')
Ответ 2
Вы можете поместить свой файл в веб-приложение/
Пример:
web-app/lexicon.txt
И затем в вашем контроллере или службе используйте grailsApplication:
class MyService {
def grailsApplication
public myMethod() {
File myFile = grailsApplication.mainContext.getResource("lexicon.txt").file
}
}
Надеюсь, что это поможет
Ответ 3
Вы можете использовать загрузку ресурсов Spring для доступа к файлу. С помощью этого метода вы можете получить доступ к файлу из Spring bean, что означает, что Grails может автоустанавливать ресурс в своих артефактах.
Ниже приведены примеры шагов ниже.
- Поместите файл в
grails-app/conf/
.
- Создайте класс держателя ресурса в
src/groovy
- Добавьте владельца ресурса как Spring bean в
grails-app/spring/resources.groovy
- Затем используйте autowire и используйте ресурс, где вам это нужно.
Шаг 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 */
}
Ответ 4
В 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)
}
}