Where to put a text file in Grails, and how to get the path

前端 未结 4 1057
感动是毒
感动是毒 2020-12-13 09:41

I need to read in a .txt file into a groovy class in order to interrogate it line by line. But I am not sure what folder I put it into in my grails app, and how to get the

相关标签:
4条回答
  • 2020-12-13 10:16

    In Grails 2, you can use the Grails Resource Locator

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

    Handy tip: to mock this in Spock, use GroovyPageStaticResourceLoader

    @TestFor(MyService)
    class MyServiceSpec extends Specification {
        def setup() {
            service.grailsResourceLocator = Mock(GroovyPageStaticResourceLocator)
        }
    }
    
    0 讨论(0)
  • 2020-12-13 10:23

    You can use Spring's resource loading to access the file. With this method you can access the file from a Spring bean, which means Grails can autowire the resource in to its artifacts.

    See below for the following steps examples

    1. Place the file in grails-app/conf/.
    2. Make a resource holder class in src/groovy
    3. Add the resource holder as a Spring bean in grails-app/spring/resources.groovy
    4. Then autowire and use the resource wherever you need it

    Step 2:

    package resource
    
    import org.springframework.core.io.Resource
    
    class ResourceHolder {
        Resource lexicon
    }
    

    Step 3:

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

    Step 4:

    class AnyGrailsService {
        def lexiconHolder
    
        void aMethodUsingTheLexicon() {
            File lexicon = lexiconHolder.lexicon.file
    
            /* Do stuff with the lexicon */
        }
    
    0 讨论(0)
  • 2020-12-13 10:25

    You can put your file under web-app/

    Example:

    web-app/lexicon.txt
    

    And then in your controller or service use grailsApplication:

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

    Hope this helps

    0 讨论(0)
  • 2020-12-13 10:27

    Grails is a Java Web Application, so it will be compiled into a sigle file .war, with all files/classes/etc inside. Most Web containers do unpack war, but there are no any guaranteee, so it's not a good idea to use File to access this file as a file.

    Btw, you can place your file into grails-app/conf, at this case it will be placed into classpath, and you'll be able to access it by using:

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

    You could also put this file into a subdirectory, like grails-app/conf/data and load it as ***.getResourceAsStream('data/lexicon.txt')

    0 讨论(0)
提交回复
热议问题