web-dev-qa-db-fra.com

Où placer un fichier texte en Grails et comment obtenir le chemin

J'ai besoin de lire un fichier .txt dans une classe groovy afin de l'interroger ligne par ligne. Mais je ne sais pas dans quel dossier je l'ai placé dans mon application Grails et comment y accéder?

Jusqu'à présent, j'ai essayé de le placer sous src et également dans un nouveau dossier web-app/txt

et j'ai essayé ce qui suit pour le lire dans

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

et

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

en vain.

Tout corps a des pointeurs?

25
andy mccullough

Grails est une application Web Java Java, elle sera donc compilée dans un fichier sigle .war, Avec tous les fichiers/classes/etc. à l'intérieur. La plupart des conteneurs Web décompressent war, mais il n'y a aucune garantie, donc ce n'est pas une bonne idée d'utiliser File pour accéder à ce fichier en tant que fichier.

Btw, vous pouvez placer votre fichier dans grails-app/conf, Dans ce cas, il sera placé dans classpath, et vous pourrez y accéder en utilisant:

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

Vous pouvez également placer ce fichier dans un sous-répertoire, comme grails-app/conf/data Et le charger en tant que ***.getResourceAsStream('data/Lexicon.txt')

34
Igor Artamonov

Vous pouvez mettre votre fichier sous web-app /

Exemple:

web-app/Lexicon.txt

Et puis dans votre contrôleur ou service, utilisez Grails

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

J'espère que cela t'aides

21

Vous pouvez utiliser le chargement des ressources de Spring pour accéder au fichier. Avec cette méthode, vous pouvez accéder au fichier à partir d'un bean Spring, ce qui signifie que Grails peut câbler automatiquement la ressource à ses artefacts.

Voir ci-dessous pour les exemples d'étapes suivantes

  1. Placez le fichier dans grails-app/conf/.
  2. Créer une classe de détenteurs de ressources dans src/groovy
  3. Ajoutez le détenteur de ressource en tant que bean Spring dans grails-app/spring/resources.groovy
  4. Câbler ensuite automatiquement et utiliser la ressource où vous en avez besoin

Étape 2:

package resource

import org.springframework.core.io.Resource

class ResourceHolder {
    Resource Lexicon
}

Étape 3:

beans = {
    lexiconHolder(resource.ResourceHolder) {
        Lexicon = 'classpath:Lexicon.txt'
    }
}

Étape 4:

class AnyGrailsService {
    def lexiconHolder

    void aMethodUsingTheLexicon() {
        File Lexicon = lexiconHolder.Lexicon.file

        /* Do stuff with the Lexicon */
    }
11
schmolly159

Dans Grails 2, vous pouvez utiliser le localisateur de ressources Grails

class MyService {
    def grailsResourceLocator

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

Astuce: pour se moquer de cela dans Spock, utilisez GroovyPageStaticResourceLoader

@TestFor(MyService)
class MyServiceSpec extends Specification {
    def setup() {
        service.grailsResourceLocator = Mock(GroovyPageStaticResourceLocator)
    }
}
7
Keith