জাভাতে প্রোপার্টি ফাইল পড়া


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নাল, এর অর্থ শ্রেণি লোডার আপনার সম্পত্তি ফাইলটি খুঁজে পাচ্ছে না। আমি অনুমান করছি যে myProp.properties আপনার প্রকল্পের মূলে রয়েছে, যদি এটি হয় তবে আপনার পূর্ববর্তী স্ল্যাশ দরকার:

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

আমার ফাইলের স্তরক্রম হ'ল: src -> মাইপ্যাকেজ -> মাইক্লাস.জভা, মাইপ্রপ.প্রেপার্টি। আপনি আমাকে যা বলেছিলেন আমি তা করেছি তবে এটি এখনও একই ব্যতিক্রম
ছুঁড়েছে

getResourceAsStreamক্লাসপথে ফাইল অনুসন্ধান করে। আপনার সম্পত্তি ফাইল যদি প্যাকেজ ডিরেক্টরিতে থাকে তবে পথ হিসাবে myPackageব্যবহার /myPackage/myProp.propertiesকরুন।
জেস্পার

2
@ মার্ক ইলিয়ট আমার কাছে যদি আমার confসমস্ত কনফিগারেশন ফাইল এবং আমার ফাইলের স্তরক্রম সংরক্ষণ করার জন্য প্যাকেজ থাকে তবে, আমি myproject ->src, conf, testকীভাবে পূর্ববর্তী স্ল্যাশ যুক্ত করে সম্পত্তিগুলি লোড করব?
রজার রায়

54


আপনি এই পৃষ্ঠায় তথ্য খুঁজে পেতে পারেন:
http://www.mkyong.com/java/java-properties-file-example/

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
ইভান্দ্রো সিলভা

25

ResourceBundleবৈশিষ্ট্য ফাইলটি পড়তে আপনি ক্লাস ব্যবহার করতে পারেন ।

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

1
রিসোর্সবাণ্ডল আরবি = রিসোর্সবান্ডেল.জেটবান্ডেল ("মাইপ্রপ");
mcolak

2
এই পদ্ধতির আই 18 এন এর জন্য প্রস্তাবিত
আরেকটি

15
Properties prop = new Properties();

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

conf/filename.properties প্রকল্পের মূল dir উপর ভিত্তি করে


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
অ্যাপ্লিকেশন
কনটেক্সট

6

আপনার ফাইলটি com/example/foo/myProps.propertiesক্লাসপথের মতোই পাওয়া উচিত । তারপরে এটি লোড করুন:

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

4

যদি আপনার কনফিগারেশন.সিআরপি / মেইন / রিসোর্স ডিরেক্টরিতে না থাকে এবং এটি প্রকল্পের মূল ডিরেক্টরিতে থাকে তবে আপনাকে নীচের মতো কিছু করতে হবে: -

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 -> মাইপ্যাকেজ -> মাইক্লাস.জভা, মাইপ্রপ.প্রেপার্টি। আপনি আমাকে যা বলেছিলেন আমি তা করেছি তবে এটি এখনও একই ব্যতিক্রম
ছুঁড়েছে

যেহেতু আপনার সম্পত্তিগুলির ফাইলটি আপনার প্রকল্পের মূলে নেই, তাই আপনাকে শীর্ষস্থানীয় স্ল্যাশের প্রয়োজন হবে না।
মার্টে

শীর্ষস্থানীয় স্ল্যাশ ছাড়াই আমি প্রথম স্থানে ব্যতিক্রম পাচ্ছিলাম। এটি এখনও কাজ করে না।
নিকোস

3

নীচে প্রদর্শিত হিসাবে ফাইলটি পড়তে আপনি java.io.Inputstream ব্যবহার করতে পারেন:

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

জাভাতে কীভাবে ইনপুটস্ট্রিম রূপান্তর করবেন? আমি ফাইল 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

যদি আপনার বৈশিষ্ট্যগুলির ফাইলের পথ এবং আপনার জাভা শ্রেণীর পথটি একই হয় তবে আপনার এটি করা উচিত।

উদাহরণ স্বরূপ:

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

আসল অর্ডার সহ বৈশিষ্ট্য ফাইল পড়ার জন্য:

    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ব্লক ফাইল ইনপুট প্রবাহ ইনস্ট্যানটিটিং নোট করুন । যেহেতু একটি 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.