Java Nashorn JavaScript引擎中未定义readFully。

7

我正在尝试使用新的Java 8 Nashorn JavaScript引擎运行JavaScript脚本,但是它会出现以下错误:

<eval>:1 ReferenceError: "readFully" is not defined

你使用的是哪个JDK?Oracle还是OpenJDK? - Elliott Frisch
在Windows 7上安装Oracle JDK:Java版本为“1.8.0_25”,Java(TM) SE Runtime Environment (build 1.8.0_25-b18),Java HotSpot(TM) Client VM (build 25.25-b02, mixed mode)。 - Stratehm
你链接的博客文章是关于OpenJDK的。它们仍然有一些不同。 - Elliott Frisch
确实。1分。所以,现在我正在寻找一种编程方式来“强制”Nashorn的脚本模式 :) - Stratehm
尝试使用openjdk 1.8.0_u45-ea,但不起作用。 - Stratehm
显示剩余4条评论
5个回答

5

最后,我实现了一个readFully函数,我在我的脚本中使用它(仅与Nashorn兼容):

function readFully(url) {
    var result = "";
    var imports = new JavaImporter(java.net, java.lang, java.io);

    with (imports) {

        var urlObj = null;

        try {
            urlObj = new URL(url);
        } catch (e) {
            // If the URL cannot be built, assume it is a file path.
            urlObj = new URL(new File(url).toURI().toURL());
        }

        var reader = new BufferedReader(new InputStreamReader(urlObj.openStream()));

        var line = reader.readLine();
        while (line != null) {
            result += line + "\n";
            line = reader.readLine();
        }

        reader.close();
    }

    return result;
}

2

readFully不是标准的JavaScript函数,很可能在Nashorn中也不是标准的函数。

当Rhino被选为Java 6的Sun实现的一部分时,出现了类似的问题。脚本工具可能提供嵌入式API中不存在的增强功能。在Java 8 Nashorn API文档中,并没有关于readFully这个函数的说明。

在之前的Java版本中,规范声明提供的脚本引擎是JRE供应商的实现细节。我不知道Java 8是否强制要求提供脚本引擎或者是否对未来的兼容性做出任何保证。如果这可能成为问题,建议仔细查看JSR-337


谢谢提供信息。我会自己实现一个readFully函数。 - Stratehm

1

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

readFully(仅限脚本模式)

此函数读取以字符串参数传递的文件的全部内容,并将其发送到标准输出,或者您可以将结果分配给一个变量。

readFully示例:

jjs> readFully("text.txt") 这是位于当前工作目录中的text.txt文件的内容。


我的问题是,通过ScriptEngine API运行时,readFully未定义。而使用jjs可执行文件则没有问题(这种方式一切正常)。 - Stratehm
1
你可以使用直接的Nashorn接口将选项传递给Nashorn。NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); String[] options = new String[] { "—scripting" }; NashornScriptEngine engine = factory.getScriptEngine(options);或者,只需在脚本的第一个字符处放置“#”。 - wickund

0

readFully仅在脚本模式下启用。Nashorn文档

尝试这个:

>>jjs -scripting
jjs> readFully("your_file")

0

readFully()函数只有在启用应用程序脚本时,才作为内置函数在nashorgn中提供。 您可以通过以下两种方式来实现:-

  1. 运行应用程序时传递 -Dnashorn.args=-scripting 以启用 Nashorn 脚本。
  2. 通过创建带有脚本参数的 Nashorn 引擎来以编程方式启用它
    NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
    ScriptEngine engine = factory.getScriptEngine(new String[] { "-scripting" });
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接