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?
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')
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
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
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: pour se moquer de cela dans Spock, utilisez GroovyPageStaticResourceLoader
@TestFor(MyService)
class MyServiceSpec extends Specification {
def setup() {
service.grailsResourceLocator = Mock(GroovyPageStaticResourceLocator)
}
}