Java에서 속성 파일 읽기


105

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

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)

고마워, 니 코스

답변:


89

예외에 InputStream따라이 null이며 이는 클래스 로더가 속성 파일을 찾지 못한다는 것을 의미합니다. myProp.properties가 프로젝트의 루트에 있다고 생각합니다.이 경우 선행 슬래시가 필요합니다.

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

내 파일 계층 구조는 src-> myPackage-> myClass.java, myProp.properties입니다. 나는 당신이 내게 조언
한대로

getResourceAsStream클래스 경로에서 파일을 검색합니다. 속성 파일이의 패키지 디렉토리에 있는 경우 경로 myPackage로 사용 /myPackage/myProp.properties합니다.
Jesper

2
@Mark Elliot conf모든 구성 파일을 저장할 패키지가 있고 파일 계층 구조가 다음과 같으면 어떻게해야 myproject ->src, conf, test합니까?, 선행 슬래시를 추가하여 속성을로드하려면 어떻게해야합니까?
Roger Ray

54


이 페이지에서 정보를 찾을 수 있습니다 :
http://www.mkyong.com/java/java-properties-file-examples/

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

3
가까운 것을 잊지 마십시오 Reader에서이 prop.load(reader)문서에 따르면 :The specified stream remains open after this method returns
Evandro 실바

25

ResourceBundle클래스를 사용 하여 속성 파일을 읽을 수 있습니다 .

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");

1
ResourceBundle rb = ResourceBundle.getBundle ( "myProp");
mcolak

2
이 접근 방식은 i18n에 권장 됩니다.
또 다른

15
Properties prop = new Properties();

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

conf/filename.properties 프로젝트 루트 디렉토리에 기반


7

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

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

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


4
ApplicationContext는 Spring 애플리케이션의 경우에만 사용 가능합니다.
joro

6

파일은 com/example/foo/myProps.properties클래스 경로에서 와 같이 사용할 수 있어야합니다 . 그런 다음 다음과 같이로드하십시오.

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

4

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

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

3

파일 이름이 정확하고 파일이 실제로 클래스 경로에 있는지 확인하십시오. getResourceAsStream()마지막 줄이 예외를 throw하는 경우가 아니면 null을 반환합니다.

myProp.properties가 프로젝트의 루트 디렉토리에있는 경우 /myProp.properties대신 사용하십시오.


내 파일 계층 구조는 src-> myPackage-> myClass.java, myProp.properties입니다. 나는 당신이 내게 조언
한대로

속성 파일이 프로젝트의 루트에 없기 때문에 선행 슬래시가 필요하지 않습니다.
모트

나는 처음에 슬래시없이 예외를 던졌습니다. 여전히 작동하지 않습니다.
nikos

3

java.io.InputStream을 사용하여 아래와 같이 파일을 읽을 수 있습니다.

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

Java에서 InputStream을 파일로 변환하는 방법은 무엇입니까? 나는 File API를 사용하여 .properties 파일을 읽고 싶었습니다

3

컨텍스트를 loader.getResourceAsStream("myPackage/myProp.properties")사용해야합니다.

행간 '/'ClassLoader.getResourceAsStream(String)메소드에서 작동하지 않습니다 .

또는 경로가 절대적인지 또는 클래스 위치에 상대적인지 확인 Class.getResourceAsStream(String)하는 데 사용하는 메서드를 사용할 수 있습니다 '/'.

예 :

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

2

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

예를 들면 :

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

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

2

현재 답변 중 어떤 것도 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);
}

1

원래 순서로 속성 파일을 읽는 경우 :

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

1

여기에있는 많은 답변은 파일 입력 스트림을 인스턴스화하지만 나중에 스트림을 닫기 위해 입력 스트림에 대한 참조를 얻지 못하는 위험한 메서드를 설명합니다. 이로 인해 댕글 링 입력 스트림과 메모리 누수가 발생합니다. 속성을로드하는 올바른 방법은 다음과 유사해야합니다.

    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-resources블록 에서 파일 입력 스트림의 인스턴스화에 유의하십시오 . a FileInputStream는 자동 닫을 수 있으므로 try-with-resources블록이 종료 된 후 자동으로 닫힙니다 . 단순 try블록 을 사용 fis.close();하려면 finally블록 에서 사용하여 명시 적으로 닫아야합니다 .


0

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

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

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

-2

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

src/main/resources/myprop.proper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.