জাভা প্যাকেজ থেকে একটি বৈশিষ্ট্য ফাইল লোড হচ্ছে


115

আমার এমন প্যাকেজ কাঠামোতে সমাহিত একটি বৈশিষ্ট্য ফাইলগুলি পড়তে হবে com.al.common.email.templates

আমি সব চেষ্টা করেছি এবং আমি তা বের করতে পারি না।

শেষ পর্যন্ত, আমার কোডটি একটি সার্লেট পাত্রে চলবে, তবে আমি কোনও কিছুর জন্য ধারকটির উপর নির্ভর করতে চাই না। আমি JUnit পরীক্ষার কেস লিখি এবং এটি উভয় ক্ষেত্রেই কাজ করা দরকার।

উত্তর:


235

প্যাকেজে কোনও শ্রেণি থেকে সম্পত্তি লোড করার সময় com.al.common.email.templatesআপনি ব্যবহার করতে পারেন

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

(সমস্ত প্রয়োজনীয় ব্যতিক্রম হ্যান্ডলিং যুক্ত করুন)।

যদি আপনার ক্লাসটি সেই প্যাকেজে না থাকে তবে আপনাকে ইনপুট স্ট্রিমটি কিছুটা ভিন্নভাবে অর্জন করতে হবে:

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ক্লাসপাথ উপর।

একটি নিখুঁত পাথ ('/' দিয়ে শুরু হওয়া) ব্যবহারের অর্থ বর্তমান প্যাকেজটিকে উপেক্ষা করা হবে।


2
পরামর্শ: কখন আপেক্ষিক ব্যবহার করতে হবে এবং কখন নিখুঁত পাথগুলি ব্যবহার করতে হবে (শুরুতে "/" সাথে এবং ছাড়াও) একটি ব্যাখ্যা যুক্ত করুন।
অ্যারন দিগুল্লা

1
যদি আপনার প্রোপার্টি ফাইলটি এসআরসি ডিরেক্টরি থেকে বাইরে থাকে তবে আপনার প্রকল্প পরিচালকের ভিতরে থাকে?
জোনাথন

1
@ জোননি: জাভা নিজেই "প্রকল্প ডিরেক্টরি" এর ধারণা নেই, কিছু আইডিইতে এটি থাকতে পারে। তবে যতদূর জাভা সম্পর্কিত তবে এটি ক্লাসপথের সাথে কোনও সম্পর্কযুক্ত ফাইল সিস্টেমের কোথাও কেবল একটি ফাইল।
জোচিম সৌর

50

জোয়াকিম সাউরের উত্তরে যুক্ত করতে, আপনার যদি কোনও স্থিতি প্রসঙ্গে এটি করার দরকার হয় তবে আপনি নীচের মতো কিছু করতে পারেন:

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

(ব্যতিক্রম হ্যান্ডলিং পূর্বের মত, elided।)


এই উত্তরটি আমার পক্ষে কাজ করেছিল। আমি কাজের গ্রহণযোগ্য উত্তর পেতে পারি না।
স্টিভ এইচএইচএইচ

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

প্রোপার্টি ক্লাসটি তার লোড পদ্ধতির মাধ্যমে ব্যবহার করে ধরে নেওয়া হচ্ছে এবং আমি অনুমান করি যে আপনি ইনপুট স্ট্রিমটি পেতে ClassLoader getResourceAsStream ব্যবহার করছেন ।

আপনি কীভাবে নাম দিয়ে যাচ্ছেন, মনে হয় এটি এই ফর্মটিতে হওয়া উচিত: /com/al/common/email/templates/foo.properties


1

আমি এই কল দিয়ে এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি

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

অতিরিক্ত, আপনার / rc


9
আপনি কোথা PropertiesUtilথেকে পাচ্ছেন ?
বেন ওয়াটসন

1

ক্লাসের প্যাকেজটি মোকাবেলা করার প্রয়োজন নেই বলে উপরের চেয়ে সমান কিন্তু এমনকি সহজ সমাধানের কথা কেউ উল্লেখ করেনি। অনুমান করা myfile.properties ক্লাসপথে আছে।

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

উপভোগ করুন


-2

নীচের কোডটি ব্যবহার করুন:

    বৈশিষ্ট্য পি = নতুন সম্পত্তি (); স্ট্রিংবুফার পাথ = নতুন স্ট্রিংবফার ( "কম / আল / সাধারণ / ইমেল / টেম্পলেট /" ); 
    পথ append ( "foo.properties" ); ইনপুটস্ট্রিম 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.