2013-03-13 8 views
21

Ich muss eine .txt-Datei in eine groovige Klasse einlesen, um sie zeilenweise abzufragen. Aber ich bin mir nicht sicher, welchen Ordner ich in meine Grails-App geschrieben habe und wie ich den Weg dorthin finde.Wohin man eine Textdatei in Grails legt und wie man den Pfad bekommt

Bisher habe ich versucht, es unter src und auch in einem neuen Ordner die web-app/txt

und ich habe versucht Platzierung der folgende, es zu lesen in

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

und

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

umsonst.

Jeder Körper irgendwelche Zeiger?

Antwort

30

Grails ist eine Java-Webanwendung, daher wird es in eine Sigle-Datei .war kompiliert, in der alle Dateien/Klassen/etc enthalten sind. Die meisten Web-Container entpacken war, aber es gibt keine Garantie, daher ist es keine gute Idee, File zu verwenden, um auf diese Datei als Datei zuzugreifen.

Btw, können Sie Ihre Datei in grails-app/conf, in diesem Fall legen Sie sie in classpath gestellt werden, und Sie können darauf zugreifen, indem Sie:

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

Sie auch diese Datei setzen könnte in ein Unterverzeichnis, wie grails-app/conf/data und laden Sie es als ***.getResourceAsStream('data/lexicon.txt')

+3

IMO setzen misc. Dateien unter Conf-Verzeichnis ist es keine perfekte Idee. – dnim

+3

es ist nicht nur eine "misc. File", es ist ein Konfigurationsartefakt höchstwahrscheinlich –

+1

Wenn Dateien in src/main/resources abgelegt werden, können sie genauso wie oben beschrieben aufgerufen werden. Zeichenfolge fileNameAndPath = this.class.classLoader.getResource ("actualFileName.txt"). GetFile() – Ask613

11

Sie können Spring Ressource laden, um auf die Datei zugreifen. Mit dieser Methode können Sie auf die Datei von einer Spring-Bean zugreifen, was bedeutet, dass Grails die Ressource automatisch in ihre Artefakte einschleusen kann.

Siehe unten für die folgenden Schritte Beispiele

  1. Legen Sie die Datei in grails-app/conf/.
  2. Eine Klasse Ressource Halter in src/groovy
  3. in den Ressourcenhalter als Spring-Bean hinzufügen grails-app/spring/resources.groovy
  4. dann die Ressource autowire und verwenden, wo immer Sie es

Schritt 2 benötigen:

package resource 

import org.springframework.core.io.Resource 

class ResourceHolder { 
    Resource lexicon 
} 

Schritt 3:

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

Schritt 4:

class AnyGrailsService { 
    def lexiconHolder 

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

     /* Do stuff with the lexicon */ 
    } 
19

Sie Ihre Datei unter web-app setzen können/

Beispiel:

web-app/lexicon.txt 

Und dann in Ihrem Controller oder eine Dienstleistung Gebrauch grailsApplication:

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

Hoffe das hilft

7

In Grails 2, können Sie das Grails Resource Locator

class MyService { 
    def grailsResourceLocator 

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

Praktischer Tipp benutzen diese in Spock zu verspotten, verwenden GroovyPageStaticResourceLoader

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