我正在尝试在groovy中实现AutoClosable InputStream,但它无法识别下面代码片段的语法,我从旧项目的Java类中获取
try (InputStream istream = new FileInputStream(new File(relativePath))) {
return IOUtils.toString(istream));
} catch (IOException e) {
e.printStackTrace();
}
所以我使用了new File(relativePath).getText()
。
def static getTemplateAsString(def relativePath) {
/*try (InputStream istream = new FileInputStream(new File(relativePath))) {
return IOUtils.toString(istream));
} catch (IOException e) {
e.printStackTrace();
}*/
try {
return new File(relativePath).getText()
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace()
} catch (IOException ioe) {
ioe.printStackTrace()
} catch (Exception e) {
e.printStackTrace()
}
return null
}
我有两个问题
new File(relativePath).getText()
自动发布类似于AutoClosable的文件资源,我在哪里可以找到它的文档?try (InputStream istream = new FileInputStream(new File(relativePath)))
语法不能在groovy中工作?Groovy:2.4.7, JVM:1.8.0_111
答案 0 :(得分:4)
Groovy中不直接支持Java 7中的try-with-resource语法,但等效语法使用 withCloseable 方法(对于流和读取器也使用类似的方法)和闭包代码块。查看Groovy enhancements to File I/O和相关的tutorial。
示例:
String text = null
new File(relativePath).withInputStream { istream ->
text = IOUtils.toString(istream);
} catch (IOException e) {
e.printStackTrace();
}
return text
对于问题的第二部分,File.getText()groovy增强实现了try-finally并关闭了流。
这与上面的代码完全相同:
text = new File(relativePath).getText()
答案 1 :(得分:2)
Groovy的try-with-resource习惯用法是withXxx方法。在你的情况下,它就像
new File(baseDir,'haiku.txt').withInputStream { stream ->
// do something ...
}
请参阅http://groovy-lang.org/groovy-dev-kit.html#_working_with_io