2012-08-07 17 views
9

Ich frage mich, warum ich diese Warnung mit der neuen Eclipse Juno bekomme, obwohl ich denke, dass ich alles richtig gemacht habe. Können Sie mir bitte sagen, warum ich diese Warnung in dem folgenden Codecode bekomme?Eclipse Juno: nicht zugewiesener schließbarer Wert

public static boolean copyFile(String fileSource, String fileDestination) 
{ 
    try 
    { 
     // Create channel on the source (the line below generates a warning unassigned closeable value) 
     FileChannel srcChannel = new FileInputStream(fileSource).getChannel(); 

     // Create channel on the destination (the line below generates a warning unassigned closeable value) 
     FileChannel dstChannel = new FileOutputStream(fileDestination).getChannel(); 

     // Copy file contents from source to destination 
     dstChannel.transferFrom(srcChannel, 0, srcChannel.size()); 

     // Close the channels 
     srcChannel.close(); 
     dstChannel.close(); 

     return true; 
    } 
    catch (IOException e) 
    { 
     return false; 
    } 
} 

Antwort

16

Wenn Sie auf Java laufen 7, können Sie die neuen Try-mit-Ressourcen verwenden Blöcke wie so, und Ihre Streams automatisch geschlossen:

public static boolean copyFile(String fileSource, String fileDestination) 
{ 
    try(
     FileInputStream srcStream = new FileInputStream(fileSource); 
     FileOutputStream dstStream = new FileOutputStream(fileDestination)) 
    { 
     dstStream.getChannel().transferFrom(srcStream.getChannel(), 0, srcStream.getChannel().size()); 
     return true; 
    } 
    catch (IOException e) 
    { 
     return false; 
    } 
} 

Sie werden nicht explizit schließen müssen die zugrunde liegenden Kanäle. Allerdings, wenn Sie nicht Java 7 verwenden, sollten Sie den Code in einer umständlichen alten Art und Weise, mit schließlich Blöcken schreiben:

public static boolean copyFile(String fileSource, String fileDestination) 
{ 
    FileInputStream srcStream=null; 
    FileOutputStream dstStream=null; 
    try { 
     srcStream = new FileInputStream(fileSource); 
     dstStream = new FileOutputStream(fileDestination) 
     dstStream.getChannel().transferFrom(srcStream.getChannel(), 0, srcStream.getChannel().size()); 
     return true; 
    } 
    catch (IOException e) 
    { 
     return false; 
    } finally { 
     try { srcStream.close(); } catch (Exception e) {} 
     try { dstStream.close(); } catch (Exception e) {} 
    } 
} 

Sehen Sie, wie viel besser die Java 7 Version ist :)

+0

Dies funktioniert, aber ich möchte jetzt, wie Sie diese Warnung entfernen, ohne diese Funktion zu verwenden! Und warum ist es nicht möglich, den FileChannel direkt in den Ressourcen zu deklarieren. EDIT: Sie haben gerade meine Frage beantwortet, aber warum schließen Sie den FileChannel nicht? – Abbadon

+0

Wenn Sie den Stream schließen, wird der Kanal geschlossen. Sie müssen es nicht explizit schließen. – Strelok

+0

Ich habe total vermisst, dass (für den Java7-Code) die Deklaration des neuen FileInputStream und OutputStream passiert, bevor die Klammern für den try {} geöffnet werden. Ich nehme an, Sie haben das erwähnt, indem Sie sie als Block "Versuch mit Ressourcen" bezeichnet haben. Nach der Korrektur verschwanden die Warnungen. Liebe es! –

4

Sie sollten immer in der Nähe in finally denn wenn eine Ausnahme steigen, werden Sie nicht die Ressourcen schließen.

FileChannel srcChannel = null 
try { 
    srcChannel = xxx; 
} finally { 
    if (srcChannel != null) { 
    srcChannel.close(); 
    } 
} 

Hinweis: auch wenn Sie im catch Block eine Rückkehr setzen, der finally Block durchgeführt werden wird.

+0

Mit dieser Lösung I bekomme eine unbehandelte IOexception! – Abbadon

+0

Nun, es war ein Beispiel, einen 'catch (IOException ioe)' Block .... –

3

Eclipse warnt Sie über die FileInputStream und FileOutputStream, dass Sie nicht mehr verweisen können.