2016-05-09 7 views
1

Eclipse schlägt vor, dass hier ein Ressourcen-Leck ist, ich bin unsicher, weil das Schreiben des Ausgabestroms geschlossen wird.Muss ich sicher Ressourcen-Closing von Dingen handhaben, die an OutputStreamWriter delegieren

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); 
    } 

Gibt es hier ein Ressourcenleck? ist FileOutputStream erfolgreich geschlossen? Ist es wichtig, ob CSVWriter nicht seit OutputStreamWriter wird? Was ist richtiger Weg, dies zu tun?

Antwort

3

Technisch haben Sie beide Recht. Sie wissen zufällig, dass die Ressource, die der CsvWriter schließt, tatsächlich eine Ressource ist, von der Sie sicher sind, dass sie geschlossen wird. Aber Eclipse weiß nicht, wie CSVWriter funktioniert. Es weiß nur, dass es ein Closable ist und nicht geschlossen wurde. Um Ihren Code zukunftssicherer zu machen und alle Warnungen wie den angezeigten zu stoppen, können Sie den CSVWriter beim Versuch mit Ressourcen verwenden.

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

FYI: Sie können beide Closables in den Versuch mit Ressourcen setzen, siehe Beispiel unten.

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

    } 
+0

kann eigentlich nicht, denn ' CsvWriter 'hat nicht' append' zum Hinzufügen der 'BOM', technischen Details ... – xenoterracide

+1

@xenoterracide Sie können beide Ressourcen in den Versuch mit Ressourcen setzen. –

-1

Da Sie 2 Ressourcen verwenden Output und CSVWriter, sollten Sie erklären/öffnen sie innerhalb der Anprobe mit-Ressourcen. In Ihrem Code ist CSVWriter nicht Teil des Deklarationsblocks try-with-resources und daher hebt Eclipse dies als Ressourcenleck hervor.

BTW, paar Möglichkeiten, können Sie Ressourcenlecks vermeiden:

  • , wenn Sie mit Java-Version < 1.7, immer in der Nähe, die Ressourcen in der schließlich blockieren. so etwas wie unten:

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

  • Wenn Sie Java Version verwenden 1.7+, die mit Ressourcen versuchen zu verwenden, wie unten:

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

Verwandte Themen