Groovy中的Autoclosable,文件资源

时间:2017-10-18 11:59:11

标签: java groovy

我正在尝试在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
}

我有两个问题

  1. new File(relativePath).getText()自动发布类似于AutoClosable的文件资源,我在哪里可以找到它的文档?
  2. 为什么try (InputStream istream = new FileInputStream(new File(relativePath)))语法不能在groovy中工作?
  3. Groovy:2.4.7, JVM:1.8.0_111

2 个答案:

答案 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