web-dev-qa-db-ja.com

Grailsでテキストファイルを配置する場所とパスを取得する方法

行ごとに問い合わせるために、.txtファイルをgroovyクラスに読み込む必要があります。しかし、私はそれを私のgrailsアプリのどのフォルダーに入れ、どのようにそのパスを取得するのかわかりませんか?

これまでのところ、srcの下と新しいフォルダweb-app/txtに配置してみました

そして私はそれを読むために以下を試しました

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

そして

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

無駄に。

体にはポインタがありますか?

25
andy mccullough

GrailsはJava Webアプリケーションなので、すべてのファイル/クラス/ etcが含まれた単一のファイル_.war_にコンパイルされます。ほとんどのWebコンテナはwarを解凍しますが、保証はありません。そのため、Fileを使用してこのファイルにファイルとしてアクセスすることはお勧めできません。

ところで、ファイルを_grails-app/conf_に配置できます。この場合、ファイルはclasspathに配置され、次のようにしてアクセスできます。

_InputStream Lexicon = this.class.classLoader.getResourceAsStream('Lexicon.txt')
_

このファイルを_grails-app/conf/data_のようなサブディレクトリに配置し、***.getResourceAsStream('data/Lexicon.txt')としてロードすることもできます。

34
Igor Artamonov

ファイルをweb-app /の下に置くことができます

例:

web-app/Lexicon.txt

次に、コントローラーまたはサービスでgrailsApplicationを使用します。

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

お役に立てれば

21

Springのリソース読み込みを使用して、ファイルにアクセスできます。このメソッドを使用すると、Spring Beanからファイルにアクセスできます。つまり、Grailsはリソースをアーティファクトに自動配線できます。

以下の手順の例については、以下を参照してください

  1. ファイルをgrails-app/conf/に配置します。
  2. src/groovyにリソースホルダークラスを作成する
  3. リソースホルダーをSpring Beanとしてgrails-app/spring/resources.groovyに追加します
  4. 次に、自動配線し、必要な場所でリソースを使用します

ステップ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 */
    }
11
schmolly159

Grails 2では、Grails Resource Locatorを使用できます

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)
    }
}
7
Keith