首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理InputStream并写入OuputStream,并确保这两个流都关闭

处理InputStream并写入OuputStream,并确保这两个流都关闭
EN

Code Review用户
提问于 2017-03-09 07:47:56
回答 3查看 88关注 0票数 -1

在单个最后块中执行多个文件关闭是一件坏事吗?

有关摘录:

代码语言:javascript
复制
BufferedInputStream inStream;
BufferedOutputStream destStream;
try {
    inStream = new BufferedInputStream(/*...*/);
    destStream = new BufferedOutputStream(/*...*/);
    // ... reading from file
    // ... processing
    // ... writting to file
    destStream.flush();
} catch (Exception e) {
    Log("ERROR: " + e.getMessage());
} finally {
    try { destStream.close(); } catch (Exception ignored) {}
    try { inStream.close(); } catch (Exception ignored) {}
}

编辑-1:我不能使用java7 (所以我不能使用来自java7的try-with ) :(

EN

回答 3

Code Review用户

发布于 2017-03-09 08:01:58

正如Nolequen所写的,他的选择更适合使用。但这是7+中才有可能只有在

如果您想继续执行您的解决方案,您可以创建一个尝试并将其放入内部。

代码语言:javascript
复制
    try {
        BufferedInputStream inStream = new BufferedInputStream(/*...*/);
        BufferedOutputStream destStream = new BufferedOutputStream(/*...*/);
        // ... reading from file
        // ... processing
        // ... writting to file
        destStream.flush();
    } catch (Exception e) {
        Log("ERROR: " + e.getMessage());
    } finally {
        try { 
            destStream.close(); 
            inStream.close();
        } catch (Exception ignored) {}
}
票数 2
EN

Code Review用户

发布于 2017-03-09 07:53:59

最好使用试着用资源语句。因此,您不需要手动关闭流:

代码语言:javascript
复制
try (final BufferedInputStream inStream = new BufferedInputStream(/*...*/);
     final BufferedOutputStream destStream = new BufferedOutputStream(/*...*/)) {
    //do some work
} catch (Exception e) {
    Log("ERROR: " + e.getMessage());
}
票数 1
EN

Code Review用户

发布于 2017-03-09 09:29:19

InputStreamOutputStream都在Java6中实现了Closable接口,这样您就可以编写自己的异常,以规范更接近的对象/方法:

代码语言:javascript
复制
private void closeIgnoringException(Closable closable){
     try { closable.close(); } 
     catch (Exception ignored) {
       ignored.printStacktrace();
     }
}

Set<Closable> closables = new HasSet<Closable>();  
try {
    BufferedInputStream inStream = new BufferedInputStream(/*...*/);
    closables.add(inStream);
    BufferedOutputStream destStream = new BufferedOutputStream(/*...*/);
    closables.add(destStream );
    // ... reading from file
    // ... processing
    // ... writting to file
    destStream.flush();
} catch (Exception e) {
    Log("ERROR: " + e.getMessage());
} finally {
    for(Closable closable : closables)
       closeIgnoringException(closable );
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/157301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档