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
grails-app/conf/
. src/groovy
grails-app/spring/resources.groovy
É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) } }