Подтвердить что ты не робот

Где поместить текстовый файл в Grails и как получить путь

Мне нужно прочитать в .txt файле в классе groovy для того, чтобы опросить его по строкам. Но я не уверен, какую папку я вложил в мое приложение grails, и как получить путь к нему?

До сих пор я попытался разместить его под src, а также в новой папке web-app/txt

и я попробовал следующее прочитать его в

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

и

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

безрезультатно.

Любое тело имеет какие-либо указатели?

4b9b3361

Ответ 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)
    }
}