답변:
InputStream을 속성에 전달할 수 있으므로 파일이 거의 모든 곳에서 호출 될 수 있습니다.
Properties properties = new Properties();
try {
properties.load(new FileInputStream("path/filename"));
} catch (IOException e) {
...
}
다음과 같이 반복하십시오.
for(String key : properties.stringPropertyNames()) {
String value = properties.getProperty(key);
System.out.println(key + " => " + value);
}
null
입니다. Javadoc
properties.load(PropertiesReader.class.getResourceAsStream("/properties.properties"));
즉, getResourceAsStream
대 FileInputStream
? 장점과 단점?
원하는 위치 에 파일을 저장할 수 있습니다 . jar 파일에 보관하려면 사용 Class.getResourceAsStream()
하거나 ClassLoader.getResourceAsStream()
액세스해야합니다. 파일 시스템에 있으면 약간 더 쉽습니다.
내 경험에서 .properties가 더 일반적이지만 모든 확장은 괜찮습니다.
사용하여 파일을로드 Properties.load
전달, InputStream
또는 StreamReader
자바 6을 사용하는 경우 당신이 경우 ( 하는 자바 6을 사용하여, 나는 아마 UTF-8과 사용하십시오 Reader
스트림에 대한 기본 설정 대신 ISO-8859-1 인코딩. )
그것은을 반복 처리 당신은 정상을 반복 원하는만큼 Hashtable
(이 Properties
사용 예에서 파생) keySet()
. 또는에서 반환 한 열거 형을 사용할 수 있습니다 propertyNames()
.
속성 파일을 Foo 클래스와 동일한 패키지에 넣으면 쉽게로드 할 수 있습니다
new Properties().load(Foo.class.getResourceAsStream("file.properties"))
속성이 해시 테이블을 확장하면 해시 테이블에서와 같은 방식으로 값을 반복 할 수 있습니다.
* .properties 확장자를 사용하면 편집기 지원을받을 수 있습니다. 예를 들어 Eclipse에는 특성 파일 편집기가 있습니다.
properties
파일 을 만들고 읽는 방법에는 여러 가지가 있습니다 .
.properties
확장 프로그램을 추천 하지만 자신의 것을 선택할 수 있습니다.java.util
패키지 => Properties
, ListResourceBundle
, ResourceBundle
클래스.Properties
또는 java.lang.System
클래스를 사용하십시오.ResourceBundle
수업:
ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties
System.out.println(rb.getString("key"));
Properties
수업:
Properties ps = new Properties();
ps.Load(new java.io.FileInputStream("my.properties"));
.properties
확장 만 필요 합니까? '.txt'확장에 어떤 문제가 있습니까? 도와주세요.
속성 파일이로드됩니다.
Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
prop.load(stream);
} finally {
stream.close();
}
모든 구성 파일이있는 디렉토리에 .properties 파일을 저장하는 데 사용하지만 액세스하는 클래스와 함께 사용하지는 않지만 여기에는 제한이 없습니다.
이름을 ... 나는 자세한 정보를 위해 .properties를 사용하고 싶지 않다면 .properties로 이름을 지정해야한다고 생각하지 않습니다.
예:
Properties pro = new Properties();
FileInputStream in = new FileInputStream("D:/prop/prop.properties");
pro.load(in);
String temp1[];
String temp2[];
// getting values from property file
String username = pro.getProperty("usernamev3");//key value in prop file
String password = pro.getProperty("passwordv3");//eg. username="zub"
String delimiter = ","; //password="abc"
temp1=username.split(delimiter);
temp2=password.split(delimiter);
속성이 레거시가되었습니다. 환경 설정 클래스는 속성보다 선호됩니다.
기본 설정 데이터의 계층 적 콜렉션에있는 노드입니다. 이 클래스를 통해 응용 프로그램은 사용자 및 시스템 환경 설정 및 구성 데이터를 저장하고 검색 할 수 있습니다. 이 데이터는 구현 종속 백업 저장소에 지속적으로 저장됩니다. 일반적인 구현에는 플랫 파일, OS 특정 레지스트리, 디렉토리 서버 및 SQL 데이터베이스가 포함됩니다. 이 클래스의 사용자는 백업 저장소의 세부 사항에 대해 걱정할 필요가 없습니다.
문자열 기반 키-값 쌍인 속성과 달리이 Preferences
클래스에는 기본 설정 데이터 저장소에서 기본 데이터를 가져오고 넣는 데 사용되는 몇 가지 메소드가 있습니다. 다음 유형의 데이터 만 사용할 수 있습니다.
특성 파일을로드하려면 절대 경로를 제공하거나 getResourceAsStream()
특성 파일이 클래스 경로에있는 경우 사용 하십시오.
package com.mypack.test;
import java.io.*;
import java.util.*;
import java.util.prefs.Preferences;
public class PreferencesExample {
public static void main(String args[]) throws FileNotFoundException {
Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class);
// Load file object
File fileObj = new File("d:\\data.xml");
try {
FileInputStream fis = new FileInputStream(fileObj);
ps.importPreferences(fis);
System.out.println("Prefereces:"+ps);
System.out.println("Get property1:"+ps.getInt("property1",10));
} catch (Exception err) {
err.printStackTrace();
}
}
}
xml 파일 :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preferences SYSTEM 'http://java.sun.com/dtd/preferences.dtd'>
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="com">
<map />
<node name="mypack">
<map />
<node name="test">
<map>
<entry key="property1" value="80" />
<entry key="property2" value="Red" />
</map>
</node>
</node>
</node>
</root>
</preferences>
환경 설정 저장소의 내부 에서이 기사 를 살펴보십시오.
순서대로 :
2. no extension is necessary
,이 진술에 대한 참조를 제공해주십시오. 나는 그것에 혼란스러워한다.
기본적으로 Java는 애플리케이션의 작업 디렉토리에서 Java를 엽니 다 (이 동작은 실제로 사용되는 OS에 따라 다릅니다). 파일을로드하려면 다음을 수행하십시오.
Properties props = new java.util.Properties();
FileInputStream fis new FileInputStream("myfile.txt");
props.load(fis)
따라서 모든 파일 확장자를 특성 파일에 사용할 수 있습니다. 또한을 사용할 수있는 한 파일을 어느 곳에 나 저장할 수 있습니다 FileInputStream
.
관련 참고 사항에서 최신 프레임 워크를 사용하는 경우 프레임 워크는 속성 파일을 여는 추가 방법을 제공 할 수 있습니다. 예를 들어 Spring ClassPathResource
은 JAR 파일 내부에서 패키지 이름을 사용하여 속성 파일을로드 하는 을 제공 합니다.
속성을 반복하는 경우 속성이로드되면 java.util.Properties
객체에 저장되어 propertyNames()
메서드 를 제공합니다 .
특성 파일 읽기 및 내용로드 Properties
String filename = "sample.properties";
Properties properties = new Properties();
input = this.getClass().getClassLoader().getResourceAsStream(filename);
properties.load(input);
다음은 A를 반복하는 효율적인 방법입니다 Properties
for (Entry<Object, Object> entry : properties.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
Java 8 에서는 모든 속성을 가져옵니다.
public static Map<String, String> readPropertiesFile(String location) throws Exception {
Map<String, String> properties = new HashMap<>();
Properties props = new Properties();
props.load(new FileInputStream(new File(location)));
props.forEach((key, value) -> {
properties.put(key.toString(), value.toString());
});
return properties;
}
1) 클래스 파일에 속성 파일을 두는 것이 좋지만 프로젝트의 어느 곳에 나 배치 할 수 있습니다.
다음은 클래스 경로에서 속성 파일을로드하고 모든 속성을 읽는 방법입니다.
Properties prop = new Properties();
InputStream input = null;
try {
String filename = "path to property file";
input = getClass().getClassLoader().getResourceAsStream(filename);
if (input == null) {
System.out.println("Sorry, unable to find " + filename);
return;
}
prop.load(input);
Enumeration<?> e = prop.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = prop.getProperty(key);
System.out.println("Key : " + key + ", Value : " + value);
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2) 속성 파일의 확장자는 .properties입니다.
속성을 반복하는 다른 방법은 다음과 같습니다.
Enumeration eProps = properties.propertyNames();
while (eProps.hasMoreElements()) {
String key = (String) eProps.nextElement();
String value = properties.getProperty(key);
System.out.println(key + " => " + value);
}
나는 작년에이 속성 틀에 글을 썼습니다. 속성을로드하는 여러 가지 방법을 제공하며 강력하게 입력해야합니다.
한 번 봐 가지고 http://sourceforge.net/projects/jhpropertiestyp/을
JHPropertiesTyped는 개발자에게 강력한 형식의 속성을 제공합니다. 기존 프로젝트에 쉽게 통합 할 수 있습니다. 속성 유형에 대한 큰 시리즈에서 처리합니다. 속성 IO 구현을 통해 속성을 한 줄 초기화하는 기능을 제공합니다. 개발자에게 고유 한 속성 유형 및 속성 io를 만들 수있는 기능을 제공합니다. 위의 스크린 샷과 같은 웹 데모도 제공됩니다. 속성을 사용하도록 선택한 경우 웹 프런트 엔드에 대한 표준 구현도 있습니다.
완전한 문서, 튜토리얼, javadoc, FAQ 등은 프로젝트 웹 페이지에서 구할 수 있습니다.
준비가 된 정적 클래스
import java.io.*;
import java.util.Properties;
public class Settings {
public static String Get(String name,String defVal){
File configFile = new File(Variables.SETTINGS_FILE);
try {
FileReader reader = new FileReader(configFile);
Properties props = new Properties();
props.load(reader);
reader.close();
return props.getProperty(name);
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
return defVal;
} catch (IOException ex) {
// I/O error
logger.error(ex);
return defVal;
} catch (Exception ex){
logger.error(ex);
return defVal;
}
}
public static Integer Get(String name,Integer defVal){
File configFile = new File(Variables.SETTINGS_FILE);
try {
FileReader reader = new FileReader(configFile);
Properties props = new Properties();
props.load(reader);
reader.close();
return Integer.valueOf(props.getProperty(name));
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
return defVal;
} catch (IOException ex) {
// I/O error
logger.error(ex);
return defVal;
} catch (Exception ex){
logger.error(ex);
return defVal;
}
}
public static Boolean Get(String name,Boolean defVal){
File configFile = new File(Variables.SETTINGS_FILE);
try {
FileReader reader = new FileReader(configFile);
Properties props = new Properties();
props.load(reader);
reader.close();
return Boolean.valueOf(props.getProperty(name));
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
return defVal;
} catch (IOException ex) {
// I/O error
logger.error(ex);
return defVal;
} catch (Exception ex){
logger.error(ex);
return defVal;
}
}
public static void Set(String name, String value){
File configFile = new File(Variables.SETTINGS_FILE);
try {
Properties props = new Properties();
FileReader reader = new FileReader(configFile);
props.load(reader);
props.setProperty(name, value.toString());
FileWriter writer = new FileWriter(configFile);
props.store(writer, Variables.SETTINGS_COMMENT);
writer.close();
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
} catch (IOException ex) {
// I/O error
logger.error(ex);
} catch (Exception ex){
logger.error(ex);
}
}
public static void Set(String name, Integer value){
File configFile = new File(Variables.SETTINGS_FILE);
try {
Properties props = new Properties();
FileReader reader = new FileReader(configFile);
props.load(reader);
props.setProperty(name, value.toString());
FileWriter writer = new FileWriter(configFile);
props.store(writer,Variables.SETTINGS_COMMENT);
writer.close();
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
} catch (IOException ex) {
// I/O error
logger.error(ex);
} catch (Exception ex){
logger.error(ex);
}
}
public static void Set(String name, Boolean value){
File configFile = new File(Variables.SETTINGS_FILE);
try {
Properties props = new Properties();
FileReader reader = new FileReader(configFile);
props.load(reader);
props.setProperty(name, value.toString());
FileWriter writer = new FileWriter(configFile);
props.store(writer,Variables.SETTINGS_COMMENT);
writer.close();
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
} catch (IOException ex) {
// I/O error
logger.error(ex);
} catch (Exception ex){
logger.error(ex);
}
}
}
여기 샘플 :
Settings.Set("valueName1","value");
String val1=Settings.Get("valueName1","value");
Settings.Set("valueName2",true);
Boolean val2=Settings.Get("valueName2",true);
Settings.Set("valueName3",100);
Integer val3=Settings.Get("valueName3",100);
다음과 같은 방법으로 특성 파일을로드 할 수 있습니다.
InputStream is = new Test().getClass().getClassLoader().getResourceAsStream("app.properties");
Properties props = new Properties();
props.load(is);
그리고 다음과 같은 람다 식을 사용하여 맵을 반복 할 수 있습니다.
props.stringPropertyNames().forEach(key -> {
System.out.println("Key is :"+key + " and Value is :"+props.getProperty(key));
});