2013-03-13 5 views
21

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

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

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

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

и

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

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

У любого органа есть указатели?

ответ

30

Grails - это веб-приложение Java, поэтому оно будет скомпилировано в файл sigle .war со всеми файлами/классами и т. Д. Внутри. Большинство веб-контейнеров распаковывают war, но никаких гарантий нет, поэтому не рекомендуется использовать File для доступа к этому файлу.

Btw, вы можете разместить свой файл в grails-app/conf, в этом случае он будет помещен в classpath, и вы сможете получить к нему доступ с помощью:

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

Вы также можете поместить этот файл в a, например grails-app/conf/data и загрузить его как ***.getResourceAsStream('data/lexicon.txt')

+3

ИМО ставить разное. файлы в каталоге conf, это не идеальная идея. – dnim

+3

это не просто «разный файл», скорее всего это артефакт конфигурации. –

+1

Если файлы помещаются в src/main/resources, то к ним можно получить доступ точно так же, как указано выше. String fileNameAndPath = this.class.classLoader.getResource ("actualFileName.txt"). GetFile() – Ask613

11

Вы можете использовать загрузку ресурсов Spring для доступа к файлу. С помощью этого метода вы можете получить доступ к файлу из Spring-компонента, что означает, что Grails может авторизовать ресурс в своих артефактах.

Ниже для следующих примеров шагов

  1. Поместите файл в grails-app/conf/.
  2. Сделать класс держатель ресурса в src/groovy
  3. Добавьте держатель ресурса как Spring бина в grails-app/spring/resources.groovy
  4. Тогда 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 */ 
    } 
19

Вы можете поместить файл под веб-приложение/

Пример:

web-app/lexicon.txt 

И тогда в вашем контроллере или использование услуг grailsApplication:

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

Надеюсь, что это поможет

7

В Grails 2, вы можете Используйте Grails Resource Locator

class MyService { 
    def grailsResourceLocator 

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

Handy совет: издеваться это в Спока, используйте GroovyPageStaticResourceLoader

@TestFor(MyService) 
class MyServiceSpec extends Specification { 
    def setup() { 
     service.grailsResourceLocator = Mock(GroovyPageStaticResourceLocator) 
    } 
} 
Смежные вопросы