source

Java에서 속성 파일 읽기

factcode 2022. 9. 12. 11:33
반응형

Java에서 속성 파일 읽기

속성 파일을 읽으려고 하는 다음 코드가 있습니다.

Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();           
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);

마지막 줄에 예외가 있어요.구체적으로는:

Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)

고마워, 니코스

예외에 , 「」는 「 」InputStreamnull 입니다 수 을 의미합니다.myProp.properties 。이 경우 슬래시가 필요합니다.

InputStream stream = loader.getResourceAsStream("/myProp.properties");


수 .
http://www.mkyong.com/java/java-properties-file-examples/httpwww.mkyong.com/java//

Properties prop = new Properties();
try {
    //load a properties file from class path, inside static method
    prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));

    //get the property value and print it out
    System.out.println(prop.getProperty("database"));
    System.out.println(prop.getProperty("dbuser"));
    System.out.println(prop.getProperty("dbpassword"));

} 
catch (IOException ex) {
    ex.printStackTrace();
}

하시면 됩니다.ResourceBundle fileclass를 합니다.

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
Properties prop = new Properties();

try {
    prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
    e.printStackTrace();
}

conf/filename.properties dir를 기반으로 합니다.

이 키워드는 다음과 같이 사용할 수 없습니다.

props.load(this.getClass().getResourceAsStream("myProps.properties"));

를 참조해 주세요.

가장 좋은 방법은 다음과 같은 애플리케이션 컨텍스트를 파악하는 것입니다.

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");

클래스 경로에서 리소스 파일을 로드할 수 있습니다.

//load a properties file from class path, inside static method
        prop.load(context.getClassLoader().getResourceAsStream("config.properties"));

이는 정적 컨텍스트와 비 정적 컨텍스트 모두에서 작동하며, 가장 좋은 점은 이 속성 파일이 응용 프로그램의 클래스 경로에 포함된 패키지/폴더에 있을 수 있다는 것입니다.

파일은 다음과 같이 사용할 수 있습니다.com/example/foo/myProps.properties클래스 패스로. 해서 해 주세요

props.load(this.getClass().getResourceAsStream("myProps.properties"));

config.properties가 src/main/resource 디렉토리에 없고 프로젝트의 루트 디렉토리에 있는 경우 다음과 같은 작업을 수행해야 합니다.

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);

그 질문은 오래된 것이군요.만약 누군가가 미래에 이것을 우연히 발견하게 된다면, 저는 이것이 하나의 간단한 방법이라고 생각합니다.프로젝트 폴더에 속성 파일을 보관합니다.

        FileReader reader = new FileReader("Config.properties");

        Properties prop = new Properties();
        prop.load(reader);

파일 이름이 올바르고 파일이 실제로 클래스 경로에 있는지 확인하십시오. getResourceAsStream()이 경우 마지막 행이 예외를 발생시키지 않을 경우 null이 반환됩니다.

경우 myProp.properties를 합니다./myProp.properties★★★★★★ 。

java.io 를 사용할 수 있습니다.다음과 같이 InputStream을 사용하여 파일을 읽습니다.

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 

「」가 되어 있는 .loader.getResourceAsStream("myPackage/myProp.properties")사용해야 합니다.

의 ★★★'/' 함께 사용할 수 없습니다ClassLoader.getResourceAsStream(String)★★★★★★ 。

'하다'를 .Class.getResourceAsStream(String) " " " 를 사용합니다.'/'패스가 절대인지 클래스 위치에 상대적인지를 판별합니다.

예:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")

속성 파일 경로와 Java 클래스 경로가 동일한 경우 이 작업을 수행해야 합니다.

예를 들어 다음과 같습니다.

src/myPackage/MyClass.java

src/myPackage/MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);

여기에서는 파일 입력 스트림을 인스턴스화하지만 스트림을 나중에 닫기 위해 입력 스트림을 참조하지 않는 위험한 방법을 설명합니다.이로 인해 입력 스트림이 행업하여 메모리 누수가 발생합니다.속성을 올바르게 로드하는 방법은 다음과 같습니다.

    Properties prop = new Properties();
    try(InputStream fis = new FileInputStream("myProp.properties")) {
        prop.load(fis);
    }
    catch(Exception e) {
        System.out.println("Unable to find the specified properties file");
        e.printStackTrace();
        return;
    }

에서 파일 입력 스트림을 인스턴스화하는 것에 주의해 주세요.try-with-resourcesblock. a부터FileInputStream자동 로스가 가능하므로 다음 시간 후에 자동으로 닫힙니다.try-with-resources블록이 종료됩니다.심플을 사용하고 싶은 경우try블록, 다음을 사용하여 명시적으로 닫아야 합니다.fis.close();에서finally차단합니다.

현재 답변 중 다음 답변은 없습니다.InputStream닫힘(파일 기술자가 누출됨) 및/또는 처리하지 않음.getResourceAsStream()리소스를 찾을 수 없을 때 null을 반환한다(이것에 의해,NullPointerException혼란스러운 메시지와 함께"inStream parameter is null"). 다음과 같은 것이 필요합니다.

String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename)) {
    if (inputStream == null) {
        throw new FileNotFoundException(propertiesFilename);
    }
    prop.load(inputStream);
} catch (IOException e) {
    throw new RuntimeException(
                "Could not read " + propertiesFilename + " resource file: " + e);
}

이전 솔루션에서는 상태가 아닌 좋은 방법은 속성, 특히 빌드 플러그인을 사용하여 컴파일 시 생성된 속성 파일을 전달하는 것입니다.PropertySourcesPlaceholderConfigr을 사용하는 것입니다.

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        PropertySourcesPlaceholderConfigurer propsConfig 
          = new PropertySourcesPlaceholderConfigurer();
        propsConfig.setLocation(new ClassPathResource("myProp.properties"));
        propsConfig.setIgnoreResourceNotFound(true);
        propsConfig.setIgnoreUnresolvablePlaceholders(true);
        return propsConfig;
    }

IOC의 재산에 접속할 수 있습니다.

    @Value("${your.desired.property.pointer}")
    private String value;

원래 순서가 있는 읽기 속성 파일의 경우:

    File file = new File("../config/edc.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
    layout.load(new InputStreamReader(new FileInputStream(file)));

    for(Object propKey : layout.getKeys()){
        PropertiesConfiguration propval =  layout.getConfiguration();
        String value = propval.getProperty((String) propKey).toString();
        out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
    }

다음과 같이 src에서 시작하는 경로를 지정합니다.

src/main/resources/myprop.proper

언급URL : https://stackoverflow.com/questions/8285595/reading-properties-file-in-java

반응형