2016-05-09 11 views
1

Eclipseはリソースのリークがあることを示唆しています。出力ストリームの書き込みが閉じているので不安です。OutputStreamWriterに委譲するもののリソースクローズを安全に処理する必要がありますか?

try (OutputStreamWriter fileWriter = new OutputStreamWriter(new FileOutputStream(file), encoder)) 
    { 
     fileWriter.append('\uFEFF'); // byte order mark 
     CSVWriter csvWriter = new CSVWriter(fileWriter); // au.com.bytecode.opencsv.CSVWriter 
     csvWriter.writeNext(headers); 
     streamSupplier.forEachOrdered(row -> { 
      if (row.length != headers.length) 
      { 
       String exception 
        = String.format("row length %d should not be different from header length %d", 
            row.length, 
            headers.length); 
       throw new IllegalStateException(exception); 
      } 
      csvWriter.writeNext(row); 
      processedHandler.accept(processed.nextInt()); 
     }); 
     csvWriter.flush(); 
     csvWriter.close(); 
     return file; 
    } 
    catch (IOException e) 
    { 
     logError(e); 
     throw new RuntimeException(e); 
    } 

ここにリソースリークがありますか? FileOutputStreamは正常に終了しましたか?もしCSVWriterOutputStreamWriterになってからでないと問題になりますか?これを行うには正しいことは何ですか?

答えて

3

技術的にはどちらも正しいです。あなたは、CsvWriterが閉じているリソースが実際にあなたが閉じられると確信しているリソースであることを知っています。しかし、EclipseはCSVWriterの機能を知らない。それは、それが閉じ込めであり、閉じられていないことを知っているだけです。あなたのコードをより将来的に証明し、あなたが見ているような警告を止めるには、リソースでtryでCSVWriterを使うことができます。

try (CSVWriter csvWriter = new CSVWriter(new OutputStreamWriter(new FileOutputStream(file), encoder))) 

FYI:Try withリソースに両方のClosableを置くことができます(下記の例を参照)。

 try ( OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream("")); BufferedWriter bw = new BufferedWriter(ow)) { 

    } 
+0

実際にはできない、 'ので、 CsvWriter'は 'BOM'、technicalitiesを追加するために' append'を持っていません。 – xenoterracide

+1

@xenoterracideリソースをtryに両方のリソースを入れることができます。 –

-1

OutputStreamWriterとCSVWriterの2つのリソースを使用しているため、try-with-resources内で宣言/開く必要があります。あなたのコードでは、CSVWriterはtry-with-resources宣言ブロックの一部ではないため、eclipseはリソースリークとして強調しています。

ところで、あなたは、リソースリークを避けることができる方法のカップルは:

  • あなたはJavaのバージョン< 1.7を使用している場合は、常にfinallyブロック内のリソースを閉じます。以下のようなもの:

    Writer writer = null; try { writer = <<Your Writer>>; //Use your writer } catch(IOException e) { //handle any exception }finally { if(writer != null) writer.close(); }

  • あなたは以下のように、リソースを試みを使用し、Javaバージョン1.7以降を使用している場合:

    try(Writer writer = <<Your Writer>>) { //Use your writer } catch(IOException e) { //handle any exception }

関連する問題