尝试最后关闭多个流

时间:2015-06-02 13:03:17

标签: java file file-io try-catch-finally

我有一个打开3个数据流的程序,但我不知道如何关闭它们,这里是程序的结束部分。

finally {//cerrando muestras
        try{
            if(muestras!=null){
                muestras.close();
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {//cerrando salida
        try{
            if(salida!=null){
                salida.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

我想这是因为我最后不能做那个嵌套,但我不知道其他方法,谢谢你的时间。

3 个答案:

答案 0 :(得分:2)

您应该使用Java 7中引入的try-with-resource语句,而不是自己关闭流。请考虑以下示例:

try (
    BufferedReader br = new BufferedReader(new FileReader(file));
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(out))
) {
    bufferedWriter.write(text);
} catch(IOException e) {
    //log or propagate to the caller
}

观察您不必手动关闭BufferedReaderBufferedWriter流。

答案 1 :(得分:1)

如果您使用的是java6或更低版本,则可以为close()使用包装

public void closeStreams(Closeable c){
  try{
    c.close();
   }
   catch(IOException e){
   }

  finally{
  // well noting here now..
  }
}

你可以使用:

finally {//cerrando muestras
            if(muestras!=null){
                muestras.closeStreams();
            }

            if(salida!=null){
                salida.closeStreams();
            }

}

答案 2 :(得分:1)

我通常最终会制作一种实用工具来做这种事情。

Stream muestras;
Stream salida;
...
finally {
        closeAll( muestras, salida );
    }


public class IoUtils
{

   private IoUtils() {}

   public static void closeAll( Closeable ... cls ) {
      for( Closeable c : cls ) {
         if( c != null )  try {
            c.close();
         } catch( IOException ex ) {
            Logger.getLogger( IoUtils.class.getName() ).
                    log( Level.SEVERE, null, ex );
         }
      }
   }
 }