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

J’ai besoin de lire un fichier .txt dans une classe groovy pour pouvoir l’interroger ligne par ligne. Mais je ne sais pas dans quel dossier je l’ai placé dans mon application Grails, et comment en obtenir le chemin?

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

et j’ai essayé le suivant pour le lire dans

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

et

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

en vain.

Un corps a-t-il des indications?

Grails est une application Web Java, elle sera donc compilée dans un fichier .war , avec tous les fichiers / classes / etc à l’intérieur. La plupart des conteneurs Web décompressent la 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 pourriez également mettre ce fichier dans un sous-répertoire, comme grails-app/conf/data et le charger comme ***.getResourceAsStream('data/lexicon.txt')

Vous pouvez mettre votre fichier sous Web-app /

Exemple:

 web-app/lexicon.txt 

Et puis, dans votre contrôleur ou service, utilisez grailsApplication:

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

J’espère que cela t’aides

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

Voir ci-dessous pour les étapes suivantes

  1. Placez le fichier dans grails-app/conf/ .
  2. Créer une classe de détenteurs de ressources dans src/groovy
  3. Ajouter le détenteur de la ressource en tant que haricot de spring dans grails-app/spring/resources.groovy
  4. Ensuite, utilisez et utilisez 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 */ } 

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 pratique: pour se moquer de cela dans Spock, utilisez GroovyPageStaticResourceLoader

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