我正在尝试使用新的Java 8 Nashorn JavaScript引擎运行JavaScript脚本,但是它会出现以下错误:
<eval>:1 ReferenceError: "readFully" is not defined
我正在尝试使用新的Java 8 Nashorn JavaScript引擎运行JavaScript脚本,但是它会出现以下错误:
<eval>:1 ReferenceError: "readFully" is not defined
最后,我实现了一个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;
}
readFully不是标准的JavaScript函数,很可能在Nashorn中也不是标准的函数。
当Rhino被选为Java 6的Sun实现的一部分时,出现了类似的问题。脚本工具可能提供嵌入式API中不存在的增强功能。在Java 8 Nashorn API文档中,并没有关于readFully这个函数的说明。
在之前的Java版本中,规范声明提供的脚本引擎是JRE供应商的实现细节。我不知道Java 8是否强制要求提供脚本引擎或者是否对未来的兼容性做出任何保证。如果这可能成为问题,建议仔细查看JSR-337。
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
readFully(仅限脚本模式)
此函数读取以字符串参数传递的文件的全部内容,并将其发送到标准输出,或者您可以将结果分配给一个变量。
readFully示例:
jjs> readFully("text.txt")
这是位于当前工作目录中的text.txt文件的内容。
readFully()函数只有在启用应用程序脚本时,才作为内置函数在nashorgn中提供。 您可以通过以下两种方式来实现:-
-Dnashorn.args=-scripting
以启用 Nashorn 脚本。NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new String[] { "-scripting" });