กำลังโหลดไฟล์คุณสมบัติจากแพ็คเกจ Java


115

ฉันต้องการอ่านไฟล์คุณสมบัติที่ฝังอยู่ในโครงสร้างแพ็คเกจของฉันในcom.al.common.email.templates.

ฉันได้ลองทุกอย่างแล้ว แต่ฉันคิดไม่ออก

ในท้ายที่สุดโค้ดของฉันจะทำงานในคอนเทนเนอร์ servlet แต่ฉันไม่ต้องการพึ่งพาคอนเทนเนอร์สำหรับอะไรเลย ฉันเขียนกรณีทดสอบ JUnit และจำเป็นต้องใช้ทั้งสองอย่าง

คำตอบ:


235

เมื่อโหลดคุณสมบัติจากคลาสในแพ็คเกจcom.al.common.email.templatesคุณสามารถใช้ได้

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(เพิ่มการจัดการข้อยกเว้นที่จำเป็นทั้งหมด)

หากชั้นเรียนของคุณไม่ได้อยู่ในแพ็คเกจนั้นคุณจะต้องได้รับ InputStream แตกต่างกันเล็กน้อย:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

พา ธ สัมพัทธ์ (ที่ไม่มีเครื่องหมาย '/' นำหน้า) ในgetResource()/ getResourceAsStream()หมายความว่าทรัพยากรจะถูกค้นหาโดยสัมพันธ์กับไดเร็กทอรีซึ่งแสดงถึงแพ็กเกจที่คลาสอยู่

การใช้java.lang.String.class.getResource("foo.txt")จะค้นหาไฟล์ (ไม่อยู่) /java/lang/String/foo.txtบน classpath

การใช้เส้นทางสัมบูรณ์ (เส้นทางที่ขึ้นต้นด้วย '/') หมายความว่าแพ็คเกจปัจจุบันถูกละเว้น


2
คำแนะนำ: เพิ่มคำอธิบายว่าเมื่อใดควรใช้สัมพัทธ์และเมื่อใดควรใช้พา ธ สัมบูรณ์ (มีและไม่มี "/" ที่จุดเริ่มต้น)
Aaron Digulla

1
จะเกิดอะไรขึ้นถ้าไฟล์คุณสมบัติของคุณอยู่นอกไดเร็กทอรี src แต่ยังอยู่ใน project director ของคุณ?
Jonathan

1
@jonney: Java ไม่มีแนวคิดเกี่ยวกับ "project directory" IDE บางตัวอาจมีเช่นนั้น แต่เท่าที่เกี่ยวข้องกับ Java มันเป็นเพียงไฟล์ที่อยู่ในระบบไฟล์ที่ไม่มีความสัมพันธ์กับ classpath เลย
Joachim Sauer

50

หากต้องการเพิ่มคำตอบของ Joachim Sauer หากคุณจำเป็นต้องทำสิ่งนี้ในบริบทคงที่คุณสามารถทำสิ่งต่อไปนี้:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(การจัดการข้อยกเว้นถูกหลีกเลี่ยงเช่นเดิม)


นี่คือคำตอบที่ได้ผลสำหรับฉัน ฉันไม่สามารถรับคำตอบที่เป็นที่ยอมรับในการทำงาน
Steve HHH

1
@cobralibre อ่านไฟล์คุณสมบัติที่อยู่ในresourcesโฟลเดอร์ในmavenโครงการได้อย่างไร
Kasun Siyambalapitiya

16

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

กรณีที่ 1: การโหลดไฟล์คุณสมบัติโดยใช้ ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

ในกรณีนี้ไฟล์คุณสมบัติต้องอยู่ในroot/srcไดเร็กทอรีเพื่อให้การโหลดสำเร็จ

กรณีที่ 2: การโหลดไฟล์คุณสมบัติโดยไม่ใช้ ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

ในกรณีนี้ไฟล์คุณสมบัติต้องอยู่ในไดเร็กทอรีเดียวกับTestLoadProperties.classไฟล์เพื่อให้โหลดสำเร็จ

หมายเหตุ: TestLoadProperties.javaและTestLoadProperties.classเป็นไฟล์สองไฟล์ที่แตกต่างกัน อดีต.javaไฟล์มักจะพบในโครงการของsrc/ไดเรกทอรีในขณะที่หลัง, .classไฟล์มักจะพบในของbin/ไดเรกทอรี


12
public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

10
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

2

สมมติว่าคุณใช้คลาสPropertiesผ่านวิธีการโหลดและฉันเดาว่าคุณกำลังใช้ ClassLoader getResourceAsStreamเพื่อรับอินพุตสตรีม

คุณส่งชื่ออย่างไรดูเหมือนว่าควรจะอยู่ในรูปแบบนี้: /com/al/common/email/templates/foo.properties


1

ฉันจัดการเพื่อแก้ปัญหานี้ด้วยการโทรนี้

Properties props = PropertiesUtil.loadProperties("whatever.properties");

พิเศษคุณต้องใส่ไฟล์ what.properties ของคุณใน / src / main / resources


9
คุณได้รับPropertiesUtilจากที่ไหน?
Ben Watson

1

ไม่มีใครพูดถึงวิธีการแก้ปัญหาที่คล้ายกัน แต่ง่ายกว่าข้างต้นโดยไม่จำเป็นต้องจัดการกับแพ็คเกจของชั้นเรียน สมมติว่า myfile.properties อยู่ใน classpath

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

สนุก


-2

กรุณาใช้รหัสด้านล่าง:

    คุณสมบัติp = คุณสมบัติใหม่(); เส้นทางStringBuffer = StringBuffer ใหม่( "com / al / common / email / template /" ); 
    เส้นทาง. ผนวก( "foo.properties" ); InputStream fs = getClass () getClassLoader () getResourceAsStream ( เส้นทาง. toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.