কীভাবে সম্পত্তি ফাইলগুলিতে সমান সাইন থেকে রক্ষা পাবেন


85

আমি =জাভা সম্পত্তি ফাইলগুলিতে সমান চিহ্ন ( ) এড়াতে পারি কীভাবে ? আমি আমার ফাইলে নিম্নলিখিত হিসাবে কিছু রাখতে চাই:

table.whereclause=where id=100

উত্তর:


84

তদুপরি, জাভাদোকের উপর ক্লাস থেকে লোড (পাঠক পাঠক) পদ্ধতিটি দেখুনProperty

ইন load(Reader reader)পদ্ধতি ডকুমেন্টেশন এটা বলে

কী লাইন প্রথম অ সাদা স্থান অক্ষর দিয়ে এবং আপ শুরু চরিত্রদের সব রয়েছে, কিন্তু সহ না, প্রথম unescaped '=', ':'বা সাদা ব্যবধান একটি লাইন টারমিনেটর ছাড়া অন্য অক্ষর। এই সমস্ত মূল সমাপ্তি অক্ষরগুলি পূর্ববর্তী ব্যাকস্ল্যাশ অক্ষর দ্বারা পালিয়ে এসে কীটিতে অন্তর্ভুক্ত থাকতে পারে; উদাহরণ স্বরূপ,

\:\=

দ্বি-চরিত্রের কী ":=". লাইন টার্মিনেটর অক্ষরগুলি ব্যবহার করে \rএবং \nপালানোর ক্রমগুলি অন্তর্ভুক্ত করা যেতে পারে । কী বাদ দেওয়ার পরে কোনও সাদা স্থান; যদি কীটির পরে প্রথম অ-সাদা স্থানের অক্ষর '=' বা হয় ':', তবে তা এড়ানো হবে এবং এটির পরে কোনও সাদা স্থানের অক্ষরও বাদ দেওয়া হবে। লাইনে থাকা সমস্ত অক্ষর যুক্ত উপাদানগুলির স্ট্রিংয়ের অংশ হয়ে যায়; যদি কোনও বাকী অক্ষর না থাকে তবে উপাদানটি খালি স্ট্রিং ""। কী এবং উপাদানটি তৈরি করে কাঁচা চরিত্রের ক্রমগুলি সনাক্ত করা গেলে, উপরে বর্ণিত অনুসারে এস্কেপ প্রসেসিং করা হয়।

আশা করি এইটি কাজ করবে.


92

আপনার নির্দিষ্ট উদাহরণে আপনাকে সমান পালাতে হবে না - এটি কেবল কীটির অংশ থাকলে আপনাকে এড়াতে হবে। বৈশিষ্ট্যের ফাইলের ফর্ম্যাটটি প্রথমে অনস্ক্যাপেড সমান মানের অংশ হিসাবে সমস্ত অক্ষরের সাথে আচরণ করবে treat


12
কেন এই চিহ্নিত করা হয়নি জানি না! সহজ উত্তর! এবং বেশিরভাগ সময় লোকেরা প্রোপার্টি ফাইলে মূল্য ছাড়ার সন্ধান করে!
তেজাস

4
ক্ষুদ্র সংশোধন: VALUE প্রথম unescaped সমান এবং পিছনের স্পেস, যে পরে সমস্ত অক্ষর শীর্ষস্থানীয় স্পেস হিসাবে বিবেচনা করবে মান বাইরে নিয়ে যাওয়া হয়। "মাইকি = আমার মান" উদাহরণটি "মাইকি = আমার মান" এর সমান।
পাওলো মেরসন

25

জাভাতে ডিফল্ট পালানোর অক্ষরটি '\'।
যাইহোক, জাভা সম্পত্তি ফাইলের ফর্ম্যাট কী = মান রয়েছে, এটি প্রথম হিসাবে সমান হওয়ার পরে সমস্ত কিছু বিবেচনা করা উচিত।


8
শীর্ষস্থানীয় হোয়াইটস্পেস বাদে (কী এবং মানের মধ্যে ওহ এবং '=' প্রয়োজনীয় নয়, এটি হতে পারে: বা একটি ফাঁকা জায়গা)
ব্র্যাড কাপিট

16

এই ধরণের সমস্যা এড়ানোর সর্বোত্তম উপায় এটি প্রোগ্রামগতভাবে সম্পত্তি তৈরি এবং তারপরে এগুলি সংরক্ষণ করে। উদাহরণস্বরূপ, এই জাতীয় কোড ব্যবহার করে:

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

এটি সিস্টেমে আউটপুট দেয় the সঠিকভাবে পালানো সংস্করণ।

আমার ক্ষেত্রে আউটপুটটি ছিল:

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

আপনি দেখতে পাচ্ছেন যে, সঠিক তথ্য হিসাবে গ্যারান্টিযুক্ত .properties ফাইলগুলির সামগ্রী তৈরি করার এটি একটি সহজ উপায়। এবং আপনি চান হিসাবে অনেক সম্পত্তি রাখতে পারেন।


6

আমার ক্ষেত্রে, দু'জন অগ্রণী '\\' আমার পক্ষে ভাল কাজ করছে।

উদাহরণস্বরূপ: যদি আপনার শব্দটিতে '#' অক্ষর থাকে (যেমন এএ # 100, আপনি দুটি প্রধান '\\' দিয়ে এড়াতে পারবেন

   key= aa\\#100


আমি দ্বিতীয় যে, আপনার দুটি ব্যাকস্ল্যাশ দরকার (গ্লাস ফিশ 4.1, বিল্ড 13)
সুসন্ত

2

আপনি এখানে দেখতে পারেন একটি জাভা সম্পত্তি কী কী একটি ফাঁকা চরিত্র অন্তর্ভুক্ত করতে পারে?

'=' equal u003d সমান পালনের জন্য

table.whereclause = যেখানে id = 100

কী: [টেবিল। কোথাও ক্ল্যাস] মান: [যেখানে আইডি = 100]

table.whereclause where u003ddd id = 100

কী: [টেবিল। কোথাও ক্ল্যাস = যেখানে] মান: [আইডি = 100]

টেবিল.ওহেন ক্লাউজ \ u003dwhere \ u0020id \ u003d100

কী: [টেবিল। কোথাও ক্লাজ = যেখানে আইডি = 100] মান: []


2

স্প্রিং বা স্প্রিং বুট এপ্লিকেশন.প্রপার্টি ফাইলগুলি এখানে বিশেষ অক্ষরগুলি থেকে বাঁচার উপায়;

table.whereclause = যেখানে id '\ =' 100


0

এই পদ্ধতির .propertiesফাইলগুলির সাথে 100% সামঞ্জস্যপূর্ণ হওয়ার গ্যারান্টিযুক্ত মান প্রোগ্রাম করার জন্য সহায়তা করা উচিত :

public static String escapePropertyValue(final String value) {
    if (value == null) {
        return null;
    }

    try (final StringWriter writer = new StringWriter()) {
        final Properties properties = new Properties();
        properties.put("escaped", value);
        properties.store(writer, null);
        writer.flush();

        final String stringifiedProperties = writer.toString();
        final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
        final Matcher matcher = pattern.matcher(stringifiedProperties);

        if (matcher.find() && matcher.groupCount() <= 2) {
            return matcher.group(matcher.groupCount());
        }

        // This should never happen unless the internal implementation of Properties::store changed
        throw new IllegalStateException("Could not escape property value");
    } catch (final IOException ex) {
        // This should never happen. IOException is only because the interface demands it
        throw new IllegalStateException("Could not escape property value", ex);
    }
}

আপনি এটিকে কল করতে পারেন:

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

এই পদ্ধতিটি খানিকটা ব্যয়বহুল তবে, কোনও ফাইলে বৈশিষ্ট্য লেখার জন্য সাধারণত যাইহোক একটি বিচ্ছিন্ন অপারেশন।


-1

আমি অক্ষরটির মধ্যে মানগুলি ইনপুট করতে সক্ষম হয়েছি:

db_user="postgresql"
db_passwd="this,is,my,password"

ডাউনভোটিং কেন? এটি একটি আসল উত্তর :)
রাসেলহফ

ওপ জাভা বৈশিষ্ট্য বলে, কোটা জাভা বৈশিষ্ট্য ফাইলগুলিতে এর মতো কাজ করে না।
টেকনোপল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.