【问题标题】:How to read a file in src/main/resources in grails如何在 grails 中读取 src/main/resources 中的文件
【发布时间】:2019-10-09 13:04:30
【问题描述】:

以前有人问过这个问题,我尝试了每个建议的解决方案,但都失败了。

我在 myapp/src/main/resources 中放了一个 javascript 文件 (hl.js)

我尝试使用“解决方案”中的以下代码阅读它:

1 - getRsourcesAsStream。返回空输入流。

 InputStream is = this.class.classLoader.getResourceAsStream("hl.js")

2 - getResource - 返回 null

 File myFile = grailsApplication.mainContext.getResource("hl.js").file

3 - 带有类加载器的 getResourceAsStream - 返回 null。

 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
 InputStream is = classLoader.getResourceAsStream("hl.js");

有趣的是,如果我执行以下操作:

 String fileNameAndPath = this.class.classLoader.getResource("hl.js").getFile()
 System.out.println(fileNameAndPath);
 File file = new File(fileNameAndPath)
 InputStream is = file.newInputStream();

打印出来:

/Users/me/dev/grails_projects/myapp/src/main/resources/hl.js

但 "is" 始终为空。

我正在尝试获取输入流,以便可以通过 nashorn 评估 javascript:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(is)

Grails 3.3.8

有什么想法吗?

【问题讨论】:

    标签: grails


    【解决方案1】:

    获取资源并在其上打开一个流。

        def resource = this.class.classLoader.getResource('conf.json')
        def path = resource.file // absolute file path
        return resource.openStream() // input stream for the file
    

    来源:https://www.damirscorner.com/blog/posts/20160313-AccessingApplicationFilesFromCodeInGrails.html

    【讨论】:

      【解决方案2】:

      好吧,我不知道为什么解决方案 1、2 和 3 不起作用,但我发现了一种更冗长的方法。主要问题是 eval() 有很多不同的实现,而 netbeans“去声明”从来没有工作过(可能是 netbeans 中的一些配置问题)。

      事实证明,我碰巧使用的 eval() 版本需要一个 Reader,而默认文档显示它在 InputStream 中需要它。另外,reader 和 InputStreamReader 不一样。

      这是我找到的解决方案:

      import javax.script.ScriptEngine
      import javax.script.ScriptEngineManager
      import org.grails.core.io.ResourceLocator
      
      ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
      String fileNameAndPath = this.class.classLoader.getResource("hl.js").getFile()
      System.out.println(fileNameAndPath);
      File file = new File(fileNameAndPath)
      System.out.println("exists: " + file.exists())
      Reader reader = file.newReader();
      engine.eval(reader)
      

      【讨论】:

        猜你喜欢
        • 2015-02-26
        • 2014-04-01
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        • 2014-09-04
        相关资源
        最近更新 更多