10

私は次のコードを持っています:

    // Read properties file.
     Properties properties = new Properties();
     try {
     properties.load(new FileInputStream("filename.properties"));
     } catch (FileNotFoundException e) {
     system.out.println("FileNotFound");
     }catch (IOException e) {
     system.out.println("IOEXCeption");
     }

FileInputStreamを閉じる必要がありますか?はいの場合、どうすればよいですか?コードチェックリストにバッドプラクティスエラーが表示されます。最後にブロックするように頼む。

4

4 に答える 4

17

インスタンスが閉じないようにFileInputStream、を閉じる必要があります。javadocPropertiesから:Properties.load()

このメソッドが戻った後、指定されたストリームは開いたままになります。

を別の変数に格納し、FileInputStreamの外部で宣言し、開いた場合に閉じるブロックをtry追加します。finallyFileInputStream

Properties properties = new Properties();
FileInputStream fis = null;
try {
    fis = new FileInputStream("filename.properties");
    properties.load(fis);
} catch (FileNotFoundException e) {
    system.out.println("FileNotFound");
} catch (IOException e) {
    system.out.println("IOEXCeption");
} finally {
    if (null != fis)
    {
        try
        {
            fis.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Java 7以降、try-with-resourcesを使用します。

final Properties properties = new Properties();
try (final FileInputStream fis =
         new FileInputStream("filename.properties"))
{
    properties.load(fis);
} catch (FileNotFoundException e) {
    system.out.println("FileNotFound");
} catch (IOException e) {
    system.out.println("IOEXCeption");
}
于 2012-07-11T10:12:21.717 に答える
3

常にストリームを閉じる必要があり、finallyブロック内でそれを行うことは良い習慣です。これは、finallyブロックが常に実行されるため、何か問題が発生した場合でも、ストリームが常に閉じていることを確認する必要があるためです。

    FileInputStream inStream = null;
    try {
        inStream = new FileInputStream("filename.properties");
        properties.load(inStream);
    } catch (FileNotFoundException e) {
        System.out.println("FileNotFound");
    } catch (IOException e) {
        System.out.println("IOEXCeption");
    } finally {
        try {
            inStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Java 7を使用している場合、新しいtry-with構文が導入されたため、これははるかに簡単になります。次に、次のように書くことができます。

try(FileInputStream inStream = new FileInputStream("filename.properties")){
       properties.load(inStream);
   } catch (FileNotFoundException e) {
        System.out.println("FileNotFound");
   } catch (IOException e) {
        System.out.println("IOEXCeption");
}

ストリームは自動的に閉じられます。

于 2012-07-11T10:14:31.780 に答える
2

ここに例があります:

    public class PropertiesHelper {
    public static Properties loadFromFile(String file) throws IOException {
        Properties properties = new Properties();
        FileInputStream stream = new FileInputStream(file);
        try {
            properties.load(stream);
        } finally {
            stream.close();
        }
        return properties;
    }
}
于 2012-07-11T10:14:49.163 に答える
1

Lombok@Cleanupを使用して簡単に行うことができます。 http://projectlombok.org/features/Cleanup.html

 Properties properties = new Properties();
 try {
   @Cleanup FileInputStream myFis = new FileInputStream("filename.properties");
   properties.load(myFis);
 } catch (FileNotFoundException e) {
   System.out.println("FileNotFound");
 }catch (IOException e) {
   System.out.println("IOEXCeption");
 }

または、Java 7を使用している場合にのみ、「リソースで試す」新機能があります。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

 Properties properties = new Properties();
 try (FileInputStream myFis = new FileInputStream("filename.properties")) {
   properties.load(myFis);
 } catch (FileNotFoundException e) {
   System.out.println("FileNotFound");
 }catch (IOException e) {
   System.out.println("IOEXCeption");
 }
于 2012-07-11T10:24:29.413 に答える