การอ่านไฟล์ Properties ใน 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)

ขอบคุณ Nikos

คำตอบ:


89

ตามข้อยกเว้นของคุณค่าInputStreamเป็นโมฆะซึ่งหมายความว่าตัวโหลดคลาสไม่พบไฟล์คุณสมบัติของคุณ ฉันเดาว่า myProp.properties อยู่ในรูทของโปรเจ็กต์ของคุณหากเป็นเช่นนั้นคุณต้องมีเครื่องหมายทับก่อนหน้านี้:

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

ลำดับชั้นไฟล์ของฉันคือ: src -> myPackage -> myClass.java, myProp.properties ฉันทำตามที่คุณแนะนำแล้ว แต่ก็ยังคงมีข้อยกเว้นเหมือนเดิม
nikos

getResourceAsStreamค้นหาไฟล์บน classpath หากไฟล์คุณสมบัติของคุณอยู่ในไดเร็กทอรีแพ็กเกจของmyPackageให้ใช้/myPackage/myProp.propertiesเป็นพา ธ
Jesper

2
@Mark Elliot จะเป็นอย่างไรถ้าฉันมีconfแพ็คเกจสำหรับเก็บไฟล์คอนฟิกูเรชันทั้งหมดและลำดับชั้นไฟล์ของฉันคือ: myproject ->src, conf, testฉันจะโหลดคุณสมบัติโดยการเพิ่มเครื่องหมายทับได้อย่างไร
Roger Ray

55


คุณสามารถค้นหาข้อมูลได้ที่หน้านี้:
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 Silva

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 บนพื้นฐานของโครงการ root dir


7

คุณไม่สามารถใช้คำหลักนี้เช่น -

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

ในบริบทคงที่

สิ่งที่ดีที่สุดคือการได้รับบริบทของแอปพลิเคชันเช่น -

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

จากนั้นคุณสามารถโหลดไฟล์ทรัพยากรจาก classpath -

//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ใน classpath จากนั้นโหลดเป็น:

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

4

หาก config.properties ของคุณไม่อยู่ในไดเร็กทอรี src / main / resource และอยู่ในไดเร็กทอรี root ของโปรเจ็กต์คุณต้องทำสิ่งที่ต้องการด้านล่าง: -

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

3

ตรวจสอบให้แน่ใจว่าชื่อไฟล์ถูกต้องและไฟล์นั้นอยู่ในพา ธ คลาสจริงๆ getResourceAsStream()จะคืนค่าว่างหากไม่ใช่กรณีที่ทำให้บรรทัดสุดท้ายโยนข้อยกเว้น

ถ้า myProp.properties อยู่ในไดเร็กทอรีรูทของโปรเจ็กต์ของคุณให้ใช้/myProp.propertiesแทน


ลำดับชั้นไฟล์ของฉันคือ: src -> myPackage -> myClass.java, myProp.properties ฉันทำตามที่คุณแนะนำแล้ว แต่ก็ยังคงมีข้อยกเว้นเหมือนเดิม
nikos

เนื่องจากไฟล์คุณสมบัติของคุณไม่ได้อยู่ที่รูทของโปรเจ็กต์ของคุณคุณจึงไม่จำเป็นต้องใช้เครื่องหมายทับ
mort

ฉันได้รับข้อยกเว้นในตอนแรกโดยไม่มีเครื่องหมายทับ มันยังใช้ไม่ได้
nikos

3

คุณสามารถใช้ java.io.InputStream เพื่ออ่านไฟล์ดังที่แสดงด้านล่าง:

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

วิธีการแปลง InputStream เป็น File ใน java? ฉันต้องการอ่านไฟล์. คุณสมบัติโดยใช้ File API

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()คืนค่าว่างเมื่อไม่พบทรัพยากร (ซึ่งจะนำไปสู่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

สำหรับการอ่านไฟล์ Properties ตามลำดับเดิม:

    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บล็อก


1

ฉันเห็นว่าคำถามเป็นคำถามเก่า หากใครเจอสิ่งนี้ในอนาคตฉันคิดว่านี่เป็นวิธีง่ายๆวิธีหนึ่ง เก็บไฟล์คุณสมบัติไว้ในโฟลเดอร์โครงการของคุณ

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.