2012-08-07 16 views
9

私はすべてを正しく閉じたと思うにもかかわらず、なぜ私は新しいEclipse JUNOでこの警告を受け取るのだろうかと思っています。次のコードでこの警告が表示される理由を教えてください。Eclipse Juno:割り当てられていないcloseable値

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

答えて

16

は、Java 7上で実行している場合、あなたはそのような新しい試み-と-リソースブロックを使用することができますし、あなたのストリームが自動的に閉じられます。

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

あなたが明示的にクローズする必要はありません基礎となるチャネルしかし、あなたは、Java 7を使用していない場合、あなたはfinallyブロックで、面倒な古い方法でコードを書く必要があります。

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

私は、そのソリューションによるJava 7のバージョンは:)

+0

これは動作しますが、この機能を使用しないでこの警告をどのように削除するかを今思っています!なぜ、リソース内のFileChannelを直接宣言することができないのでしょうか。編集:あなたは私の質問に答えたが、なぜあなたはfileChannelを閉じないでください? – Abbadon

+0

ストリームを閉じると、ストリームが閉じます。明示的に閉じる必要はありません。 – Strelok

+0

try {}の角括弧を開く前に、新しいFileInputStreamとOutputStreamの宣言が(java7コードの場合)完全に間違っていました。私は彼らにtry-with-resourcesブロックと呼んで言われたと思います。これを訂正した後、警告は消えた。大好きです! –

4

あなたはfinallyで常に近い例外上昇場合は、リソースを閉じませんはずだから。

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

注:catchブロックで戻りを入れた場合でも、finallyブロックが行われます。

+0

がどのようにより良い参照してくださいに未処理のIO例外を取得してください! – Abbadon

+0

これは例です。キャッチ(IOException ioe)ブロックを入れてください.... –

3

日食はFileInputStreamFileOutputStreamについてあなたがもう参照できないことを警告しています。

関連する問題