জাভা মাল্টলাইন স্ট্রিং


516

পার্ল থেকে আগত, আমি অবশ্যই সোর্স কোডে মাল্টি-লাইন স্ট্রিং তৈরির "এখানে-নথি" অর্থ অনুপস্থিত:

$string = <<"EOF"  # create a three-line string
text
text
text
EOF

জাভাতে, আমার স্ক্র্যাচ থেকে আমার মাল্টলাইন স্ট্রিংটি সংবিধান করার সাথে সাথে প্রতিটি লাইনে আমার কাছে জটিল কোট এবং প্লাস চিহ্ন থাকতে হবে।

আরও ভাল বিকল্প কি কি? একটি বৈশিষ্ট্য ফাইল আমার স্ট্রিং সংজ্ঞায়িত?

সম্পাদনা : দুটি উত্তর বলছে যে স্ট্রিংবিল্ডার.অ্যাপেন্ড () যোগফলের চেয়ে বেশি পছন্দনীয়। তারা কেন এমনভাবে ভাবছে তা কেউ ব্যাখ্যা করতে পারেন? এটি আমার কাছে মোটেও বেশি ভাল দেখাচ্ছে না doesn't আমি এমন একটি উপায় সন্ধান করছি যে মাল্টলাইন স্ট্রিংগুলি প্রথম-শ্রেণীর ভাষা নির্মাণ নয়, যার অর্থ আমি অবশ্যই প্রথম-শ্রেণীর ভাষা নির্মাণ (প্লাস সহ স্ট্রিং কনটেন্টেশন) পদ্ধতি কলগুলির সাথে প্রতিস্থাপন করতে চাই না।

সম্পাদনা : আমার প্রশ্নটি আরও পরিষ্কার করতে, আমি মোটেও পারফরম্যান্স নিয়ে উদ্বিগ্ন নই। আমি রক্ষণাবেক্ষণযোগ্যতা এবং ডিজাইনের সমস্যা সম্পর্কে উদ্বিগ্ন।


12
স্ট্রিংবিল্ডার.এপেন্ড () বারবার স্ট্রিংয়ের সাথে যুক্ত করার সময় প্লাসের চেয়ে বেশি পছন্দনীয় কারণ প্রতিবার string1 + string2আপনি যখন একটি নতুন স্ট্রিং অবজেক্ট বরাদ্দ করেন এবং ইনপুট স্ট্রিং দুটি থেকে অক্ষর অনুলিপি করেন। আপনি যদি স্ট্রিংগুলি একসাথে যুক্ত করে থাকেন তবে আপনি এন -1 বরাদ্দ এবং আনুমানিক (n ^ 2) / 2 অক্ষর অনুলিপি করছেন। অন্যদিকে স্ট্রিংবিল্ডার অনুলিপি করে অনুলিপি করে এবং পুনরায় পুনঃনির্ধারণ করে (যদিও আপনি এর অভ্যন্তরীণ বাফারের আকারকে ছাড়িয়ে গেলে এটি উভয় ক্ষেত্রেই হয়)। তাত্ত্বিকভাবে, এমন কেস রয়েছে যেখানে সংকলক স্ট্রিংবুডার ব্যবহার করতে রূপান্তর করতে পারে তবে বাস্তবে কে জানে।
লরেন্স গনসাল্ভেস

5
প্রতিবার আমি যখন ডিবাগারে ঝাঁপ দাও, তখন জাভা 1.5 তে স্ট্রিংবিল্ডার.এপেন্ড () কল রূপান্তরিত হয়। আমার সহকর্মীরা বিভ্রান্ত হয়ে আমাকে বলেছিল যে স্ট্রিংবিল্ডারের একটি বাগ রয়েছে যেহেতু তারা কোডটিতে ডিবাগ করেছে যা এটি কল করে এবং সেখানে সরে যায় বলে মনে হয় না।
skiphoppy


61
নোট করুন যে "abc \ n" + "Def \ n" ইত্যাদি দিয়ে তৈরি একটি স্ট্রিং আক্ষরিক স্ট্রিংবিল্ডার ব্যবহার করে না: সংকলক তাদের একসাথে আঠালো করে এবং একক আক্ষরিক হিসাবে। ক্লাস ফাইলে রাখে, অন্যান্য ধরণের মতোই file ধ্রুবক ভাঁজ
আরাকনিদ

6
বেশিরভাগ আইডিইগুলি বহু-লাইন স্ট্রিংগুলিতে প্রবেশ সমর্থন করে। অর্থাত। আপনি কেবল "" স্ট্রিংয়ে যা চান তা টাইপ করুন বা আটকান এবং এটি প্রয়োজনীয় হিসাবে \ n এবং "+" যুক্ত করবে। উদাহরণস্বরূপ আমি একটি স্ট্রিংয়ে 40 লাইনের পাঠ্য আটকে দিতে পারি এবং এটি আইডিই আপনার জন্য বাছাই করে।
পিটার লরি

উত্তর:


118

স্টিফেন কোলবর্ন জাভা 7-তে মাল্টি-লাইন স্ট্রিং যুক্ত করার জন্য একটি প্রস্তাব তৈরি করেছেন ।

এছাড়াও, গ্রোভির ইতিমধ্যে বহু-লাইন স্ট্রিংগুলির সমর্থন রয়েছে ।


14
জাভা উন্নয়নের জন্য প্রকল্পের কয়েন প্রক্রিয়াতে মাল্টি লাইন স্ট্রিংগুলি মেইল.ওপেনজডক.জাভা.নেট / পিপারমেল / সইন- দেব / ২০০৯-ফেব্রুয়ারি /… অন্তর্ভুক্ত ছিল । এটা তোলে ওরাকল প্রত্যাখ্যান করেছে blogs.sun.com/darcy/entry/project_coin_final_five
জোদাস্টেফেন

8
2012 সালে কোন পরিবর্তন?
ইলিয়া জি

13
দুর্ভাগ্যক্রমে এটি এটিকে অনুমান করে তোলে।
নামুওল


8
দেখে মনে হচ্ছে, জানুয়ারী 2018 পর্যন্ত, সম্প্রদায়টি বহু-লাইন স্ট্রিংগুলিকে পুনরায় বিবেচনা করছে। openjdk.java.net/jeps/326
শেন গ্যানন

485

দেখে মনে হচ্ছে আপনি কোনও মাল্টলাইন আক্ষরিক করতে চান যা জাভাতে নেই।

আপনার সেরা বিকল্পটি স্ট্রিংগুলি হতে চলেছে যা কেবল +একসাথে। কিছু অন্যান্য বিকল্প লোকেরা উল্লেখ করেছে (স্ট্রিংবিল্ডার, স্ট্রিং.ফর্ম্যাট, স্ট্রিং.জোঁইন) কেবলমাত্র যদি আপনি স্ট্রিংগুলির একটি অ্যারে দিয়ে শুরু করেন।

এই বিবেচনা:

String s = "It was the best of times, it was the worst of times,\n"
         + "it was the age of wisdom, it was the age of foolishness,\n"
         + "it was the epoch of belief, it was the epoch of incredulity,\n"
         + "it was the season of Light, it was the season of Darkness,\n"
         + "it was the spring of hope, it was the winter of despair,\n"
         + "we had everything before us, we had nothing before us";

বনাম StringBuilder:

String s = new StringBuilder()
           .append("It was the best of times, it was the worst of times,\n")
           .append("it was the age of wisdom, it was the age of foolishness,\n")
           .append("it was the epoch of belief, it was the epoch of incredulity,\n")
           .append("it was the season of Light, it was the season of Darkness,\n")
           .append("it was the spring of hope, it was the winter of despair,\n")
           .append("we had everything before us, we had nothing before us")
           .toString();

বনাম String.format():

String s = String.format("%s\n%s\n%s\n%s\n%s\n%s"
         , "It was the best of times, it was the worst of times,"
         , "it was the age of wisdom, it was the age of foolishness,"
         , "it was the epoch of belief, it was the epoch of incredulity,"
         , "it was the season of Light, it was the season of Darkness,"
         , "it was the spring of hope, it was the winter of despair,"
         , "we had everything before us, we had nothing before us"
);

বনাম জাভা 8 String.join():

String s = String.join("\n"
         , "It was the best of times, it was the worst of times,"
         , "it was the age of wisdom, it was the age of foolishness,"
         , "it was the epoch of belief, it was the epoch of incredulity,"
         , "it was the season of Light, it was the season of Darkness,"
         , "it was the spring of hope, it was the winter of despair,"
         , "we had everything before us, we had nothing before us"
);

আপনি আপনার নির্দিষ্ট সিস্টেমের জন্য সম্পর্কে newline চান, আপনি ব্যবহার হয় প্রয়োজন System.lineSeparator(), অথবা আপনি ব্যবহার করতে পারেন %nমধ্যে String.format

আরেকটি বিকল্প হ'ল সংস্থানটি কোনও পাঠ্য ফাইলে রাখা এবং কেবলমাত্র সেই ফাইলটির বিষয়বস্তু পড়ুন। আপনার শ্রেণীর ফাইলগুলি অকারণে ফুলে যাওয়া এড়াতে এটি খুব বড় স্ট্রিংয়ের পক্ষে পছন্দনীয়।


246
তদুপরি, প্রথম সংস্করণটি স্বয়ংক্রিয়ভাবে সংকলক দ্বারা সংক্ষিপ্ত হয়ে যাবে, যেহেতু সমস্ত স্ট্রিং সংকলন সময়ে জানা ছিল। সংকলনের সময় স্ট্রিংগুলি না জানা থাকলেও, এটি স্ট্রিংবিল্ডার বা স্ট্রিং.উফর্ম্যাট () এর চেয়ে ধীর নয়। আপনি যদি লুপটি করে থাকেন তবে এটির সাথে যুক্ত হওয়া এড়ানোর একমাত্র কারণ।
মাইকেল মায়ার্স

23
String.formatসংস্করণটির সমস্যাটি হ'ল আপনাকে লাইনটির সংখ্যার সাথে ফর্ম্যাটটি সিঙ্ক করে রাখতে হবে।
বার্ট ভ্যান হিউকেলোম

4
String.format অন্য দুটি উদাহরণ তুলনায় দক্ষ নয়
cmcginty

10
এই উত্তরটি হাতে থাকা প্রশ্নের খুব অনুপযুক্ত সমাধান। আমাদের কাছে 2000 লাইন এসএএস ম্যাক্রোস বা 200 লাইনের এসকিউএল কোয়েরি রয়েছে যা আমরা অনুলিপি এবং আটকানোতে চাই। এই মাল্টিলাইন পাঠ্যটিকে স্ট্রিংবফার সংযোজনে রূপান্তর করতে আমরা "+" কনক্যাট ব্যবহার করার পরামর্শ দেওয়ার জন্য এটি হাস্যকর।
ধন্য গীক

21
@ બ્લેকিজিক: জাভা ভাষায় কোন বিকল্পগুলি উপলব্ধ ছিল সে সম্পর্কে প্রশ্ন ছিল। এটি স্ট্রিংয়ে যাওয়া ডেটার ধরণের সম্পর্কে কিছু উল্লেখ করেনি। যদি এর থেকে আরও ভাল সমাধান থাকে তবে আপনি এটি উত্তর হিসাবে পোস্ট করতে পারেন। দেখে মনে হচ্ছে জোশ কারেনের সমাধান আপনার পরিস্থিতির জন্য আরও ভাল। আপনি যদি কেবলই বিরক্ত হন যে ভাষাটি বহু লাইন অক্ষরে অক্ষরে সমর্থন করে না তবে এটি সম্পর্কে অভিযোগ করার জন্য এটি ভুল জায়গা।
কিপ করুন

188

Eclipse এ যদি আপনি "স্ট্রিংকে আক্ষরিক মধ্যে পেস্ট করার সময় পাঠ্য রচনা" বিকল্পটি চালু করেন (পছন্দসমূহ> জাভা> সম্পাদক> টাইপিং) এবং একটি বহু-রেখাযুক্ত স্ট্রিং হুইটিন উদ্ধৃতি পেস্ট করুন, এটি স্বয়ংক্রিয়ভাবে যুক্ত হবে "এবং \n" +আপনার সমস্ত লাইনের জন্য।

String str = "paste your text here";

15
আপনি ""
বব বি

আপনি কি সাধারণত \rউইন্ডোজটিতে Eclipse রাখে?
নওম্যানন

99

এটি একটি পুরানো থ্রেড, তবে একটি নতুন বেশ মার্জিত সমাধান (কেবলমাত্র 4 টি 3 টির কমতি রয়েছে) একটি কাস্টম টীকা ব্যবহার করা।

চেক করুন: http://www.adrianwalker.org/2011/12/java-multline-string.html

সেই কাজ থেকে অনুপ্রাণিত একটি প্রকল্প গিটহাবে হোস্ট করা হয়েছে:

https://github.com/benelog/multiline

জাভা কোডের উদাহরণ:

import org.adrianwalker.multilinestring.Multiline;
...
public final class MultilineStringUsage {

  /**
  <html>
    <head/>
    <body>
      <p>
        Hello<br/>
        Multiline<br/>
        World<br/>
      </p>
    </body>
  </html>
  */
  @Multiline
  private static String html;

  public static void main(final String[] args) {
    System.out.println(html);
  }
}

ত্রুটিগুলি হয়

  1. আপনাকে সংশ্লিষ্ট (সরবরাহিত) টিকা প্রোটেসরটি সক্রিয় করতে হবে।
  2. স্ট্রিং ভেরিয়েবল স্থানীয় ভেরিয়েবল চেক কাঁচা স্ট্রিং ল্যাটারাল প্রকল্প হিসাবে সংজ্ঞায়িত করা যায় না যেখানে আপনি স্থানীয় ভেরিয়েবল হিসাবে ভেরিয়েবল সংজ্ঞায়িত করতে পারেন
  3. স্ট্রিংটিতে ভিজ্যুয়াল বেসিকের মতো অন্যান্য ভেরিয়েবলগুলি থাকতে পারে না X এক্সএমএল আক্ষরিক ( <%= variable %>) :-) সহ নেট
  4. স্ট্রিং আক্ষরিক জাভাডক মন্তব্য (/ **) দ্বারা সীমিত করা হয়েছে

এবং আপনার জাভাদোক মন্তব্যগুলি স্বয়ংক্রিয়ভাবে পুনরায় ফর্ম্যাট না করতে আপনাকে অবশ্যই Eclipse / Intellij-Idea কনফিগার করতে হবে।

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


মাল্টিলাইন স্ট্রিং ব্যবহার করে চূড়ান্ত হতে ক্লাসটির কী দরকার? এছাড়াও, গ্রহন থেকে কোড বিকাশ ও সম্পাদন করার সময় কি কোনও সেটআপ প্রয়োজন? রেফারেন্স ইউআরএলে টীকা প্রক্রিয়াজাতকরণের জন্য মাভেনের সেটআপ প্রয়োজনীয়তার উল্লেখ আছে। গ্রহনের কোনও দরকার হলে কী দরকার তা আমি বুঝতে পারি না।
ডেভিড

টীকাটি উপযুক্ত - তবে এটি মনে হয় যে মাভেনের উপর একটি শক্ত নির্ভরতাও ছিল? এই অংশটি হেরডোকের মূল্যের অনেকগুলি অংশ কেড়ে নেয় যা ছোট ছোট টুকরো টুকরোটির পরিচালনা সহজ করে দেয়।
জাভাদবা

3
আপনি এটি পুরোপুরি গ্রহনে করতে পারবেন। @ এসআরজি উপরে যে লিঙ্কটি পোস্ট করেছে তা আপনাকে এই লিঙ্কটিতে নির্দেশ করে । আপনি যদি গ্রহপ ব্যবহার করছেন, তবে সেটআপের এক মিনিট এবং এটি কাজ করছে।
মাইকেল প্লুটজ

4
এটি সম্ভবত আমার দেখা সবচেয়ে বড় হ্যাক। সম্পাদনা: কিছুই নয় ... বব অ্যালব্রাইটের উত্তর দেখুন।
Lallw Vallis

1
আমি এই প্রকল্পটির একটি এক্সটেনশান তৈরি করে একটি নতুন তৈরি করেছি যা স্থানীয় ভেরিয়েবল সমর্থিত, প্রকল্পটি একবার দেখুন
deFreitas

62

আর একটি বিকল্প হতে পারে বহিরাগত ফাইলে দীর্ঘ স্ট্রিংগুলি সঞ্চয় করা এবং ফাইলটিকে স্ট্রিংয়ে পড়া।


13
যথাযথভাবে। বৃহত পরিমাণে পাঠ্য জাভা উত্সে অন্তর্ভুক্ত নয়; ক্লাস.জেট রিসোর্স (স্ট্রিং) এ কল করার মাধ্যমে লোড হয়ে পরিবর্তে উপযুক্ত বিন্যাসের একটি সংস্থান ফাইল ব্যবহার করুন।
এরিকসন

5
রাইট! আপনি সহজেই আই 18 এন পাঠ্য লোড করতে লোকেল + রিসোর্সবাণ্ডল এরও ব্যবহার করতে পারেন এবং তারপরে স্ট্রিং.ফর্ম্যাট () কলটি "\ n" এর নিউলাইন হিসাবে পার্স করবে :) উদাহরণ: স্ট্রিং রেডিআরএসটি = স্ট্রিং.পারস (রিসোর্সবান্ডেল.জেটস্ট্রিং (" ভূমিকা "));
এটোরাস

62
আপনার কোনও স্ট্রিংকে বহিরাগত করা উচিত নয় কারণ এটি বহু-লাইনের। আমার যদি একটি রেইজেক্স থাকে যা আমি মন্তব্য সহ একাধিক লাইনে বিভক্ত করতে চাই? এটি জাভাতে দেখতে কুৎসিত দেখাচ্ছে। @C # এর জন্য সিনট্যাক্স অনেক ক্লিনার।
জেরেমি স্টেইন

8
স্কিপ্পপি কেবলমাত্র অনুচ্ছেদের দৈর্ঘ্যের স্ট্রিং ধ্রুবক ব্যবহার করতে ফাইলগুলির সাথে ডিল করার ওভারহেড নিয়ে বিরক্ত করতে চান না। আমি আমার উত্স কোডটিতে এম্বেড থাকা সি ++ এ সারাক্ষণ মাল্টলাইন স্ট্রিং ব্যবহার করি।
টিম কুপার

9
কি দারুন. আমি বিশ্বাস করতে পারি না যে সি ++ আসলে এই ইস্যুতে জাভার চেয়ে ভাল! আমি বহু-লাইন স্ট্রিং ধ্রুবকগুলিকে পছন্দ করি এবং তারা কিছু ক্ষেত্রে উত্সের সাথে সম্পর্কিত।
ব্যবহারকারী 1

59

এটি এমন কিছু যা আপনার কখনই ব্যবহার করছে না এটি কী করছে তা ভেবে ভেবে। তবে এক-অফ স্ক্রিপ্টগুলির জন্য আমি এটি দুর্দান্ত সাফল্যের সাথে ব্যবহার করেছি:

উদাহরণ:

    System.out.println(S(/*
This is a CRAZY " ' ' " multiline string with all sorts of strange 
   characters!
*/));

কোড:

// From: http://blog.efftinge.de/2008/10/multi-line-string-literals-in-java.html
// Takes a comment (/**/) and turns everything inside the comment to a string that is returned from S()
public static String S() {
    StackTraceElement element = new RuntimeException().getStackTrace()[1];
    String name = element.getClassName().replace('.', '/') + ".java";
    StringBuilder sb = new StringBuilder();
    String line = null;
    InputStream in = classLoader.getResourceAsStream(name);
    String s = convertStreamToString(in, element.getLineNumber());
    return s.substring(s.indexOf("/*")+2, s.indexOf("*/"));
}

// From http://www.kodejava.org/examples/266.html
private static String convertStreamToString(InputStream is, int lineNum) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null; int i = 1;
    try {
        while ((line = reader.readLine()) != null) {
            if (i++ >= lineNum) {
                sb.append(line + "\n");
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return sb.toString();
}

15
চূড়ান্ত বাইনারি সহ ক্লাসের জন্য জাভা কোড শিপিংয়ের প্রয়োজন। হুম।
থোরবজর্ন রাভন অ্যান্ডারসন

23
আমি যখন এই জাতীয় কিছু পরীক্ষা করার চেষ্টা করি তখন আমি আমার সহকর্মীদের প্রতিক্রিয়াটি কল্পনা করতে পারি ...
ল্যান্ডন কুহান

15
+1 টি। ব্যক্তিরা ভোট দিয়ে নিচে কল্পনার কিছু অভাব। এটি ছোট ইউটিলিটিগুলি, পরীক্ষার কেসগুলি এবং এমনকি নিয়ন্ত্রিত প্রোড পরিবেশে লেখার জন্য একটি দরকারী নির্মাণ। এটি রুবি / পাইথন / ইত্যাদিতে জাভা বাদ দেওয়া বা এখানে থাকার মধ্যে একটি পার্থক্য নির্মাতা।
জাভাদ্ব্বা

1
দুর্দান্ত সমাধান, তবে দুর্ভাগ্যক্রমে অ্যান্ড্রয়েডের জন্য কাজ করবে না কারণ এটি এমুলেটর বা বাস্তব ডিভাইসে কার্যকর করা হবে এবং সেখানে কোনও উত্স কোড নেই।
evgeny.myasishchev

হতে পারে এটি একটি জাভা 8 প্রোব, বা অন্য কিছু, তবে উদাহরণে ক্লাসলুডারটি বিদ্যমান নেই। আমি MyClass.class.getResourceAsStream (...) ব্যবহার করে চেষ্টা করেছি, তবে এটি সর্বদা শূন্য হয়। পরীক্ষার জন্য একটি দুর্দান্ত দ্রুত সমাধান হত!
নিক

54

String.join

জাভা 8 একটি নতুন স্থিতিশীল পদ্ধতি যুক্ত করেছে java.lang.Stringযা কিছুটা ভাল বিকল্প প্রস্তাব করে:

String.join( CharSequence delimiter , CharSequence... elements )

এটি ব্যবহার করছি:

String s = String.join(
    System.getProperty("line.separator"),
    "First line.",
    "Second line.",
    "The rest.",
    "And the last!"
);

5
পরিষ্কার পরিচ্ছন্ন সমাধান! আইডিই এবং প্রিপ্রসেসরের উপর নির্ভরতা নেই! কোনও ম্যানুয়াল "\n"প্রয়োজন হয় না, এবং বহনযোগ্যতা সম্পর্কে সচেতন!
সিউ চিং পং-আসুকা কেনজি-

1
আমি বুঝতে পারি যে আমার মন্তব্যটি অকেজো, তবে মাল্টলাইন স্ট্রিং আক্ষরিক হিসাবে এই জাতীয় কোনও জিনিসটির জন্য হ্যাক্স খুঁজতে এত তাড়াতাড়ি করা হয়েছে। কেন হ্যাক জাভা এখনও এই অনুমানের সাথে যুক্ত করতে পারে না?
দিমিত্রি

22

জেপি 355: পাঠ্য ব্লকগুলি (পূর্বরূপ) এর উদ্দেশ্য এই কার্যকারিতাটি কভার করা, এটি বর্তমানে জেডিকে 13 কে পূর্বরূপ বৈশিষ্ট্য হিসাবে লক্ষ্য করছে । এরকম কিছু লেখার অনুমতি দিচ্ছে:

String s = """
    text
    text
    text
  """;

এই জেপি এর আগে, জেডিকে 12-এ, জেইপি 326: কাঁচা স্ট্রিং লিটারালস একই জাতীয় বৈশিষ্ট্যটি বাস্তবায়নের লক্ষ্যে ছিল, তবে শেষ পর্যন্ত তা প্রত্যাহার করা হয়েছিল।


2
তারা এই সমর্থনটি বাদ দিয়েছে
ডিফ্রেটিস

2
পাঠ্য ব্লকগুলি এখন জাভা 13-এর অংশ
ZhekaKozlov

19

আপনি যদি কোনও বৈশিষ্ট্য ফাইলে আপনার স্ট্রিংগুলি সংজ্ঞায়িত করেন তবে এটি আরও খারাপ দেখাবে। আইআইআরসি, দেখতে এটির মতো লাগবে:

string:text\u000atext\u000atext\u000a

সাধারণত উত্সে বড় স্ট্রিং এম্বেড না করা একটি যুক্তিসঙ্গত ধারণা। আপনি হয়ত এগুলি XML বা পাঠযোগ্য পাঠ্য বিন্যাসে, উত্স হিসাবে লোড করতে চাইতে পারেন। পাঠ্য ফাইলগুলি হয় রানটাইমে পড়া বা জাভা উত্সে সংকলিত হতে পারে। যদি আপনি তাদের উত্সটিতে রেখে শেষ করেন, তবে আমি পরামর্শ দিচ্ছি যে +সামনেটি রাখা এবং অপ্রয়োজনীয় নতুন লাইন বাদ দেওয়া:

final String text = ""
    +"text "
    +"text "
    +"text"
;

আপনার যদি নতুন লাইন থাকে তবে আপনি কিছু সংযুক্ত বা বিন্যাস পদ্ধতি চান:

final String text = join("\r\n"
    ,"text"
    ,"text"
    ,"text"
);

17

প্লাসগুলি স্ট্রিংবিল্ডার.অ্যাপেন্ডে রূপান্তরিত হয়, যখন উভয় স্ট্রিং ধ্রুবক হয় তখনই সংকলক সংকলনের সময় তাদের সংহত করতে পারে। কমপক্ষে, এটি সূর্যের সংকলকটিতে এটিই রয়েছে এবং অন্য সমস্ত সংকলক একইরূপ না করলে আমি সবচেয়ে বেশি সন্দেহ করব।

তাই:

String a="Hello";
String b="Goodbye";
String c=a+b;

সাধারণত ঠিক একই কোড উত্পন্ন করে:

String a="Hello";
String b="Goodbye":
StringBuilder temp=new StringBuilder();
temp.append(a).append(b);
String c=temp.toString();

অন্য দিকে:

String c="Hello"+"Goodbye";

হিসাবে একই:

String c="HelloGoodbye";

এটি হ'ল পাঠযোগ্যতার জন্য আরও চিহ্ন সহ একাধিক লাইন জুড়ে আপনার স্ট্রিং লিটারালগুলি ভাঙ্গার কোনও জরিমানা নেই।


4
প্রযুক্তিগত হতে, আপনার প্রথম উদাহরণে এটি আরও কিছু উত্পন্ন করে: স্ট্রিং সি = নতুন স্ট্রিংবিল্ডার ()। সংযোজন (ক) .অপেন্ড (খ) .টো স্ট্রিং (); পার্থক্য হ'ল অস্থায়ী স্ট্রিং বিল্ডার সুযোগের বাইরে এবং স্ট্রিং সি = ... লাইনের পরপরই আবর্জনা সংগ্রহের জন্য যোগ্য, যেখানে "টেম্প" স্ট্রিং বিল্ডার কিছুটা বেশি সময় ধরে থাকতেন।
কিপ

সত্য। আমার বক্তব্যটি অবশ্যই আলাদা করতে হবে যখন রান-টাইমে বনাম যখন কাজটি সংকলনের সময় করা যায় তখন কোনও ফাংশন বলা হয়। তবে আপনি সঠিক।
জয়

15

ইন্টেলিজ আইডিইতে আপনাকে কেবল টাইপ করতে হবে:

""

তারপরে আপনার কার্সারটি উদ্ধৃতি চিহ্নগুলির মধ্যে রাখুন এবং আপনার স্ট্রিংটি আটকে দিন। আইডিই এটিকে একাধিক সংলগ্ন লাইনে প্রসারিত করবে।


11

দুঃখজনকভাবে, জাভাতে মাল্টি-লাইন স্ট্রিং লিটারেল নেই। আপনি হয় স্ট্রিং লিটারালসকে কনটেনেট করতে হবে (+ বা স্ট্রিংবিল্ডার এটির মধ্যে দুটিতে সবচেয়ে সাধারণ পন্থা হিসাবে ব্যবহার করে) বা আলাদা ফাইল থেকে স্ট্রিংটি পড়তে হবে।

বড় মাল্টি-লাইন স্ট্রিং লিটারেলের জন্য আমি একটি পৃথক ফাইল ব্যবহার করতে এবং সেটিকে getResourceAsStream()( Classশ্রেণীর একটি পদ্ধতি ) ব্যবহার করে পড়তে আগ্রহী । এটি ফাইল সন্ধান করা সহজ করে তোলে কারণ আপনার কোডটি যেখানে ইনস্টল করা হয়েছিল তার বিপরীতে আপনাকে বর্তমান ডিরেক্টরি সম্পর্কে চিন্তা করতে হবে না। এটি প্যাকেজিংকে আরও সহজ করে তোলে, কারণ আপনি আসলে আপনার জার ফাইলটিতে ফাইলটি সংরক্ষণ করতে পারেন।

মনে করুন আপনি ফু নামে একটি ক্লাসে রয়েছেন। এই জাতীয় কিছু করুন:

Reader r = new InputStreamReader(Foo.class.getResourceAsStream("filename"), "UTF-8");
String s = Utils.readAll(r);

অন্য একটি বিরক্তি হ'ল জাভাতে একটি স্ট্রিংতে এই পাঠকটির সমস্ত পাঠ্য "স্ট্যান্ডার্ড" নেই। যদিও এটি লেখা খুব সহজ:

public static String readAll(Reader input) {
    StringBuilder sb = new StringBuilder();
    char[] buffer = new char[4096];
    int charsRead;
    while ((charsRead = input.read(buffer)) >= 0) {
        sb.append(buffer, 0, charsRead);
    }
    input.close();
    return sb.toString();
}

আমি একইভাবে করি. আপনি ফাইলের বিষয়বস্তু আরও সহজে পড়তে ("ফাইলUtils.readFileToString (ফাইল ফাইল)" সহ) কমন্স-আইও ব্যবহার করতে পারেন।
এসআরজি

জাভা সম্পর্কে সত্য নয় সমস্ত পাঠ্য পদ্ধতি পড়ুন ... - জাভা 7 আপনি ফাইল.ড্রেডএললাইনস (পাথ)
সিসিপিজা

10
String newline = System.getProperty ("line.separator");
string1 + newline + string2 + newline + string3

তবে, সেরা বিকল্পটি ব্যবহার করা স্ট্রিং.ফর্ম্যাট

String multilineString = String.format("%s\n%s\n%s\n",line1,line2,line3);

আমার মতামতটি হল যে এটি প্লাস চিহ্নগুলি এবং উদ্ধৃতিগুলি সরিয়ে দেয়, এটি আরও পাঠযোগ্য করে তোলে, বিশেষত যখন মাত্র 3 টি লাইনের বেশি থাকে। যদিও স্ট্রিং.ফর্ম্যাট এর মতো ভাল নয়।
টম

2
স্ট্রিংবিল্ডারের উদাহরণ কমপক্ষে অপঠনযোগ্য। এছাড়াও, ভুলে যাবেন না যে "\ n" সর্বদা একটি নতুন লাইন নয়, তবে এটি লিনাক্স এবং ইউনিক্স মেশিনগুলির জন্য দুর্দান্ত।
স্টিফান থাইবার্গ

প্লাস, কেবল স্ট্রিংবিল্ডারের উপস্থিতি উল্লেখ করতে চেয়েছিল।
টম

4
ছয়-অক্ষর পদ্ধতির নাম এবং প্রথম বন্ধনীর সাথে একটি প্লাস চিহ্নটি প্রতিস্থাপন করা আমার কাছে বেশি পঠনযোগ্য মনে হয় না, যদিও দৃশ্যত আপনি কেবল সেই ব্যক্তিই নন যে এইভাবে চিন্তা করেন। যদিও এটি উদ্ধৃতিগুলি সরিয়ে দেয় না। তারা এখনও আছে।
skiphoppy

9

যেহেতু জাভা (এখনও) নেটিভ মাল্টি-লাইন স্ট্রিং সমর্থন করে না, তাই এখনকার একমাত্র উপায় উপরোক্ত কৌশলগুলির মধ্যে একটির ব্যবহার করে এটির চারপাশে হ্যাক করা। আমি উপরে বর্ণিত কয়েকটি কৌশল ব্যবহার করে নিম্নলিখিত পাইথন স্ক্রিপ্টটি তৈরি করেছি:

import sys
import string
import os

print 'new String('
for line in sys.stdin:
    one = string.replace(line, '"', '\\"').rstrip(os.linesep)
    print '  + "' + one + ' "'
print ')'

এটি javastringify.py নামে একটি ফাইলে রাখুন এবং আপনার স্ট্রিংটি একটি ফাইল mystring.txt এ রাখুন এবং এটি নিম্নলিখিত হিসাবে চালান:

cat mystring.txt | python javastringify.py

তারপরে আপনি আউটপুটটি অনুলিপি করতে পারেন এবং এটি আপনার সম্পাদকে আটকান।

কোনও বিশেষ ক্ষেত্রে পরিচালনা করার জন্য এটি প্রয়োজনীয় হিসাবে এটি সংশোধন করুন তবে এটি আমার প্রয়োজনের জন্য কাজ করে। আশাকরি এটা সাহায্য করবে!


9

আপনি স্কালা-কোড ব্যবহার করতে পারেন, যা জাভার সাথে সামঞ্জস্যপূর্ণ এবং "" "দিয়ে সংযুক্ত মাল্টলাইন-স্ট্রিংগুলিকে অনুমতি দেয়:

package foobar
object SWrap {
  def bar = """John said: "This is
  a test
  a bloody test,
  my dear." and closed the door.""" 
}

(স্ট্রিংয়ের ভিতরে কোটগুলি নোট করুন) এবং জাভা থেকে:

String s2 = foobar.SWrap.bar ();

এটা কি আরও আরামদায়ক ...?

অন্য পদ্ধতির, যদি আপনি প্রায়শই লম্বা পাঠ্যটি হ্যান্ডেল করেন যা আপনার উত্সকোডে রাখা উচিত, এটি কোনও স্ক্রিপ্ট হতে পারে যা কোনও বাহ্যিক ফাইল থেকে পাঠ্যকে নিয়ে যায় এবং এটিকে একটি বহুমুখী জাভা-স্ট্রিং হিসাবে আবৃত করে:

sed '1s/^/String s = \"/;2,$s/^/\t+ "/;2,$s/$/"/' file > file.java

যাতে আপনি এটিকে সহজেই আপনার উত্সে কাটতে পারেন।


8

আপনি আলাদাভাবে পৃথক পদ্ধতিতে আপনার সংযোজনগুলি যুক্ত করতে পারেন:

public static String multilineString(String... lines){
   StringBuilder sb = new StringBuilder();
   for(String s : lines){
     sb.append(s);
     sb.append ('\n');
   }
   return sb.toString();
}

যেভাবেই হোক, StringBuilderপ্লাস সংকেতকে প্রাধান্য দিন ।


5
আমি কেন স্ট্রিংবিল্ডারকে প্লাস নোটেশনের চেয়ে বেশি পছন্দ করি?
skiphoppy

10
দক্ষতা, বা বরং এটি প্রায়শই একটি বিভ্রান্ত প্রচেষ্টা।
মাইকেল মায়ার্স

2
দক্ষতার চেষ্টাটি ভিত্তিক, আমি মনে করি, জাভা সংকলক স্ট্রিংবিল্ডার ব্যবহার করে স্ট্রিং কনটেকটনেশন অপারেটরটি প্রয়োগ করে (স্ট্রিংবফার প্রাক -১.৫ সংকলকগুলিতে)। একটি পুরানো, তবে সুপরিচিত নিবন্ধ রয়েছে যে উল্লেখ করে যে স্ট্রিংবুফার (বা স্ট্রিংবুডার, এখন) ব্যবহারের নির্দিষ্ট পরিস্থিতিতে পারফরম্যান্স সুবিধা রয়েছে। এখানে লিঙ্কটি দেওয়া আছে: java.sun.com/developer/JDCTechTips/2002/tt0305.html
পল মরি

4
কেবল তখনই যখন সংকলক এটি করতে পারে না। আক্ষরিক এবং ধ্রুবকগুলির জন্য, আপনি যদি প্লাস চিহ্ন ব্যবহার করেন তবে সংকলন-সময় সংক্ষিপ্তকরণটি করা হবে। স্ট্রিংবিল্ডার ব্যবহার এটি রানটাইম সময়ে ঘটতে বাধ্য করে, সুতরাং এটি কেবল আরও কাজ নয়, এটি ধীর।
জনসিপ

7

প্রকৃতপক্ষে, নীচেরটি আমি এখনও অবধি দেখলাম সবচেয়ে পরিষ্কার বাস্তবায়ন। কোনও মন্তব্যকে স্ট্রিং ভেরিয়েবলে রূপান্তর করতে এটি একটি টীকা ব্যবহার করে ...

/**
  <html>
    <head/>
    <body>
      <p>
        Hello<br/>
        Multiline<br/>
        World<br/>
      </p>
    </body>
  </html>
  */
  @Multiline
  private static String html;

সুতরাং, শেষ ফলাফলটি হল ভেরিয়েবল এইচটিএমএলটিতে মাল্টলাইন স্ট্রিং রয়েছে। কোনও উদ্ধৃতি, কোনও প্লাস, কোনও কমা, খাঁটি স্ট্রিং নেই।

এই সমাধানটি নিম্নলিখিত ইউআরএলে উপলভ্য ... http://www.adrianwalker.org/2011/12/java-m Multilineline- string.html

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


সেই টীকাটি প্রসেসরের আরও মজবুত চেকিং দরকার
ট্রিপ কাইনেটিক্স

আমি এটি পছন্দ করি এটি চেষ্টা করে দেখুন
জাভাদবা

7

জাভা স্ট্রিংফায়ার দেখুন । আপনার পাঠ্যটি স্ট্রিংবিল্ডার জাভা ব্লককে পাল্টানোর প্রয়োজনে পাল্টে দেয়।


1
হ্যাঁ, কারণ আমি সেই সাইটটিতে আমার জীবন অনুলিপি এবং পেষ্ট করতে পারি। আমি এগুলি কেবল একটি ফাইলে সংরক্ষণ করতে পারি এবং এটি লোড করতে পারি তবে এটি কোনও আদর্শ সমাধান নয়।
মিমি

7
    import org.apache.commons.lang3.StringUtils;

    String multiline = StringUtils.join(new String[] {
        "It was the best of times, it was the worst of times ", 
        "it was the age of wisdom, it was the age of foolishness",
        "it was the epoch of belief, it was the epoch of incredulity",
        "it was the season of Light, it was the season of Darkness",
        "it was the spring of hope, it was the winter of despair",
        "we had everything before us, we had nothing before us",
        }, "\n");

6

উত্তর হিসাবে আমি এখনও দেখা যায় নি একটি বিকল্প হ'ল java.io.PrintWriter

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter);
writer.println("It was the best of times, it was the worst of times");
writer.println("it was the age of wisdom, it was the age of foolishness,");
writer.println("it was the epoch of belief, it was the epoch of incredulity,");
writer.println("it was the season of Light, it was the season of Darkness,");
writer.println("it was the spring of hope, it was the winter of despair,");
writer.println("we had everything before us, we had nothing before us");
String string = stringWriter.toString();

এছাড়াও java.io.BufferedWriterএকটি newLine()পদ্ধতি আছে যে সত্য নিরীক্ষণ।


5

আপনি যদি আমার মতো গুগলের পেয়ারা পছন্দ করেন তবে এটি আপনার নতুন লাইনের চরিত্রগুলিকেও হার্ডকোড না করার জন্য বেশ পরিষ্কার উপস্থাপনা এবং একটি দুর্দান্ত, সহজ উপায় দিতে পারে:

String out = Joiner.on(newline).join(ImmutableList.of(
    "line1",
    "line2",
    "line3"));

5

ব্যবহার Properties.loadFromXML(InputStream)। বাহ্যিক libs প্রয়োজন নেই।

একটি অগোছালো কোডের চেয়ে ভাল (যেহেতু রক্ষণাবেক্ষণযোগ্যতা এবং নকশাটি আপনার উদ্বেগের বিষয়), দীর্ঘ স্ট্রিং ব্যবহার না করাই ভাল।

এক্সএমএল বৈশিষ্ট্যগুলি পড়ে শুরু করুন:

 InputStream fileIS = YourClass.class.getResourceAsStream("MultiLine.xml");
 Properties prop = new Properies();
 prop.loadFromXML(fileIS);


তারপরে আপনি আপনার মাল্টলাইন স্ট্রিংকে আরও রক্ষণাবেক্ষণযোগ্য উপায়ে ব্যবহার করতে পারেন ...

static final String UNIQUE_MEANINGFUL_KEY = "Super Duper UNIQUE Key";
prop.getProperty(UNIQUE_MEANINGFUL_KEY) // "\n    MEGA\n   LONG\n..."


মাল্টিলাইন.এক্সএমএল একই ফোল্ডারে আপনার ক্লাসে অবস্থিত:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>
    <entry key="Super Duper UNIQUE Key">
       MEGA
       LONG
       MULTILINE
    </entry>
</properties>

পিএস: আপনি এক্সএমএল-জাতীয় স্ট্রিংয়ের জন্য <![CDATA["... ব্যবহার করতে পারেন "]]>


হ্যাঁ, এটিই আমি ব্যবহার করি দুর্দান্ত সমাধান! বাহ্যিক এক্সএমএল সম্পত্তি ফাইলে এসকিউএল বা এক্সএমএল সরান। এটি কোড আপ জড়ান না। :)
লাস্লো লুগোসি

এটি প্রশ্নের উত্তর দেয় না। হেরডোকগুলি ফাইলের মধ্যে সংজ্ঞা অনুসারে হয় । কথাটি হ'ল এটি এক জায়গায় রাখা।
জাভাদবা

5

সঙ্গে JDK / 12 আগাম অ্যাক্সেস বিল্ড # 12 , এক এখন একাধিক লাইন স্ট্রিং জাভা নিম্নরূপ ব্যবহার করতে পারেন:

String multiLine = `First line
    Second line with indentation
Third line
and so on...`; // the formatting as desired
System.out.println(multiLine);

এবং এর ফলাফল নিম্নলিখিত ফলাফল:

First line
    Second line with indentation
Third line
and so on...

সম্পাদনা: জাভা 13 এ স্থগিত



2
সাইবারসফ্ট অন্য মন্তব্যে যেমন বলেছে, কাঁচা স্ট্রিং লিটারালগুলি (জেইপি 326) চূড়ান্ত জেডিকে 12 থেকে সরানো হয়েছে, তবে জেডিকে 13-এ প্রাকদর্শন হিসাবে করা যেতে পারে "টেক্সট ব্লকস" যুক্ত করতে আরও একটি জেইপি তৈরি করা হয়েছে
ম্যানুয়েল রোমিরো

4

একটি কার্যকর এবং প্ল্যাটফর্মের স্বাধীন সমাধানটি লাইন বিভাজক এবং স্ট্রিংবিল্ডার শ্রেণীর জন্য সিস্টেম সম্পত্তি ব্যবহার করে স্ট্রিং তৈরি করতে পারে:

String separator = System.getProperty("line.separator");
String[] lines = {"Line 1", "Line 2" /*, ... */};

StringBuilder builder = new StringBuilder(lines[0]);
for (int i = 1; i < lines.length(); i++) {
    builder.append(separator).append(lines[i]);
}
String multiLine = builder.toString();

4

একটি ভাল বিকল্প।

import static some.Util.*;

    public class Java {

        public static void main(String[] args) {

            String sql = $(
              "Select * from java",
              "join some on ",
              "group by"        
            );

            System.out.println(sql);
        }

    }


    public class Util {

        public static String $(String ...sql){
            return String.join(System.getProperty("line.separator"),sql);
        }

    }

4

এটি একটি খুব সাধারণ প্রশ্ন, তাই আমি এই উত্তরটিকেও একটি নিবন্ধে পরিণত করার সিদ্ধান্ত নিয়েছি ।

জাভা 13 এবং এর বাইরে

মাল্টলাইন স্ট্রিংস এখন টেক্সট ব্লকের মাধ্যমে জাভাতে সমর্থিত । জাভা 13 এবং 14 এ, এই বৈশিষ্ট্যটির জন্য ––enable–previewআপনার প্রকল্পটি তৈরি এবং পরিচালনা করার সময় বিকল্পটি সেট করা দরকার । পরীক্ষা করে দেখুন এই জাভা ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।

এখন, জাভা 13 এর আগে, আপনি কীভাবে এই প্রশ্নটি লিখবেন:

List<Tuple> posts = entityManager
.createNativeQuery(
    "SELECT *\n" +
    "FROM (\n" +
    "    SELECT *,\n" +
    "           dense_rank() OVER (\n" +
    "               ORDER BY \"p.created_on\", \"p.id\"\n" +
    "           ) rank\n" +
    "    FROM (\n" +
    "        SELECT p.id AS \"p.id\",\n" +
    "               p.created_on AS \"p.created_on\",\n" +
    "               p.title AS \"p.title\",\n" +
    "               pc.id as \"pc.id\",\n" +
    "               pc.created_on AS \"pc.created_on\",\n" +
    "               pc.review AS \"pc.review\",\n" +
    "               pc.post_id AS \"pc.post_id\"\n" +
    "        FROM post p\n" +
    "        LEFT JOIN post_comment pc ON p.id = pc.post_id\n" +
    "        WHERE p.title LIKE :titlePattern\n" +
    "        ORDER BY p.created_on\n" +
    "    ) p_pc\n" +
    ") p_pc_r\n" +
    "WHERE p_pc_r.rank <= :rank\n",
    Tuple.class)
.setParameter("titlePattern", "High-Performance Java Persistence %")
.setParameter("rank", 5)
.getResultList();

জাভা 13 টেক্সট ব্লককে ধন্যবাদ, আপনি নিম্নলিখিত হিসাবে এই কোয়েরিটি আবার লিখতে পারেন:

List<Tuple> posts = entityManager
.createNativeQuery("""
    SELECT *
    FROM (
        SELECT *,
               dense_rank() OVER (
                   ORDER BY "p.created_on", "p.id"
               ) rank
        FROM (
            SELECT p.id AS "p.id",
                   p.created_on AS "p.created_on",
                   p.title AS "p.title",
                   pc.id as "pc.id",
                   pc.created_on AS "pc.created_on",
                   pc.review AS "pc.review",
                   pc.post_id AS "pc.post_id"
            FROM post p
            LEFT JOIN post_comment pc ON p.id = pc.post_id
            WHERE p.title LIKE :titlePattern
            ORDER BY p.created_on
        ) p_pc
    ) p_pc_r
    WHERE p_pc_r.rank <= :rank
    """,
    Tuple.class)
.setParameter("titlePattern", "High-Performance Java Persistence %")
.setParameter("rank", 5)
.getResultList();

আরও অনেক পাঠযোগ্য, তাই না?

আইডিই সমর্থন

ইন্টেলিজ আইডিইএ লেগ্যাসি Stringকনটেনটেশন ব্লকে নতুন মাল্টলাইন Stringফর্ম্যাটে রূপান্তর করার জন্য সহায়তা সরবরাহ করে:

ইন্টেলিজ আইডিইএ পাঠ্য ব্লক সমর্থন

জেএসএন, এইচটিএমএল, এক্সএমএল

মাল্টলাইন String সহায়ক যখন তাদেরকে JSON, এইচটিএমএল, অথবা XML লেখা হয়।

Stringএকটি JSON স্ট্রিং আক্ষরিক তৈরি করতে কনটেক্সটেশন ব্যবহার করে এই উদাহরণটি বিবেচনা করুন :

entityManager.persist(
    new Book()
    .setId(1L)
    .setIsbn("978-9730228236")
    .setProperties(
        "{" +
        "   \"title\": \"High-Performance Java Persistence\"," +
        "   \"author\": \"Vlad Mihalcea\"," +
        "   \"publisher\": \"Amazon\"," +
        "   \"price\": 44.99," +
        "   \"reviews\": [" +
        "       {" +
        "           \"reviewer\": \"Cristiano\", " +
        "           \"review\": \"Excellent book to understand Java Persistence\", " +
        "           \"date\": \"2017-11-14\", " +
        "           \"rating\": 5" +
        "       }," +
        "       {" +
        "           \"reviewer\": \"T.W\", " +
        "           \"review\": \"The best JPA ORM book out there\", " +
        "           \"date\": \"2019-01-27\", " +
        "           \"rating\": 5" +
        "       }," +
        "       {" +
        "           \"reviewer\": \"Shaikh\", " +
        "           \"review\": \"The most informative book\", " +
        "           \"date\": \"2016-12-24\", " +
        "           \"rating\": 4" +
        "       }" +
        "   ]" +
        "}"
    )
);

পালানোর অক্ষর এবং ডাবল উদ্ধৃতি এবং অতিরিক্ত চিহ্নগুলির প্রাচুর্যের কারণে আপনি সবে JSON পড়তে পারেন।

জাভা টেক্সট ব্লক সহ, জেএসওএন অবজেক্টটি এভাবে লেখা যেতে পারে:

entityManager.persist(
    new Book()
    .setId(1L)
    .setIsbn("978-9730228236")
    .setProperties("""
        {
           "title": "High-Performance Java Persistence",
           "author": "Vlad Mihalcea",
           "publisher": "Amazon",
           "price": 44.99,
           "reviews": [
               {
                   "reviewer": "Cristiano",
                   "review": "Excellent book to understand Java Persistence",
                   "date": "2017-11-14",
                   "rating": 5
               },
               {
                   "reviewer": "T.W",
                   "review": "The best JPA ORM book out there",
                   "date": "2019-01-27",
                   "rating": 5
               },
               {
                   "reviewer": "Shaikh",
                   "review": "The most informative book",
                   "date": "2016-12-24",
                   "rating": 4
               }
           ]
        }
        """
    )
);

২০০৪ সালে আমি যখন সি # ব্যবহার করেছি তখন থেকেই আমি জাভাতে এই বৈশিষ্ট্যটি পেতে চাইছিলাম, এবং এখন অবশেষে এটি আমাদের কাছে রয়েছে।


3

একটি বৈশিষ্ট্য ফাইল আমার স্ট্রিং সংজ্ঞায়িত?

বৈশিষ্ট্য ফাইলগুলিতে একাধিক স্ট্রিং অনুমোদিত নয়। আপনি বৈশিষ্ট্য ফাইলগুলিতে \ n ব্যবহার করতে পারেন, তবে আমি মনে করি না এটি আপনার ক্ষেত্রে সমাধানের অনেক বেশি।


বৈশিষ্ট্য ফাইলে থাকা মানটি একাধিক লাইন বিস্তৃত করতে পারে: সমস্ত লাইন শেষ করুন তবে শেষ ব্যাকস্ল্যাশ দিয়ে শেষ করুন। এটি প্ল্যাটফর্ম-নির্দিষ্ট হিসাবে আপনি লাইন বিভাজক হিসাবে কী ব্যবহার করেন তা সমস্যা ছেড়ে দেয়। আমি মনে করি আপনি একটি সাধারণ \ n ব্যবহার করতে পারেন এবং তারপরে আপনার কোডটিতে, সম্পত্তিটি পড়ার পরে, অনুসন্ধান করুন এবং line n প্রতিস্থাপন করুন \ n লাইন.সেপরেটারে। এটি কিছুটা কুলদেগি বলে মনে হচ্ছে তবে আমি অনুমান করি যে আপনি কোনও ফাংশন লিখতে পারেন যা কোনও সম্পত্তি পুনরুদ্ধার করে এবং একই সময়ে এই হেরফেরটি করে। ঠিক আছে, এই সমস্ত অনুমান করে যে আপনি কোনও ফাইলগুলিতে এই স্ট্রিংগুলি লিখবেন, এটি একটি বড় অনুমান।
জে

3

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে ছেদযুক্ত বিকাশকারীদের জন্য মাল্টি লাইন লিটারেলগুলি # জাভা 12-এ থাকবে

http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html


নাঃ। কিন্তু হয়নি পরিশেষে জাভা 13. যা আমার দল সম্ভবত দেড় দশক সম্পর্কে দত্তক গ্রহণ করা হবে এটি তৈরি করতে।
জাভাদবা

3

আমি থমাস্পের পরামর্শ অনুসারে কোনও ইউটিলিটি ব্যবহার করার পরামর্শ দিচ্ছি এবং তারপরে আপনার বিল্ড প্রক্রিয়ায় এটি লিঙ্ক করব। বাহ্যিক ফাইলটি পাঠ্য ধারণ করতে এখনও উপস্থিত রয়েছে, তবে ফাইলটি রানটাইম পড়েনি। কর্মপ্রবাহটি তখন:

  1. 'জাভা কোড টেক্সটফাইলে' ইউটিলিটি তৈরি করুন এবং সংস্করণ নিয়ন্ত্রণে পরীক্ষা করুন
  2. প্রতিটি বিল্ডে, সংশোধিত জাভা উত্স তৈরি করতে রিসোর্স ফাইলের বিরুদ্ধে ইউটিলিটি চালান
  3. জাভা উত্সের মতো একটি শিরোনাম রয়েছে class TextBlock {... স্ট্যাটিক স্ট্রিংয়ের যা রিসোর্স ফাইল থেকে স্বয়ংক্রিয়ভাবে উত্পন্ন হয়
  4. আপনার বাকী কোড সহ উত্পন্ন জাভা ফাইলটি তৈরি করুন

2

যখন একটি দীর্ঘ সিরিজ ব্যবহার করা হয়, কেবলমাত্র একটি স্ট্রিংবিল্ডার তৈরি করা হয়, যদি না স্ট্রিং সংকলন সময়ে নির্ধারিত হয় যার ক্ষেত্রে কোনও স্ট্রিংবিল্ডার ব্যবহার করা হয় না!

স্ট্রিংবিল্ডার কেবলমাত্র দক্ষ যখন স্ট্রিংটি নির্মাণের জন্য একাধিক বিবৃতি ব্যবহৃত হয় more

String a = "a\n";
String b = "b\n";
String c = "c\n";
String d = "d\n";

String abcd = a + b + c + d;
System.out.println(abcd);

String abcd2 = "a\n" +
        "b\n" +
        "c\n" +
        "d\n";
System.out.println(abcd2);

দ্রষ্টব্য: কেবলমাত্র একটি স্ট্রিংবিল্ডার তৈরি করা হয়েছে।

  Code:
   0:   ldc     #2; //String a\n
   2:   astore_1
   3:   ldc     #3; //String b\n
   5:   astore_2
   6:   ldc     #4; //String c\n
   8:   astore_3
   9:   ldc     #5; //String d\n
   11:  astore  4
   13:  new     #6; //class java/lang/StringBuilder
   16:  dup
   17:  invokespecial   #7; //Method java/lang/StringBuilder."<init>":()V
   20:  aload_1
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:  aload_2
   25:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   28:  aload_3
   29:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   32:  aload   4
   34:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   37:  invokevirtual   #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   40:  astore  5
   42:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   45:  aload   5
   47:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   50:  ldc     #12; //String a\nb\nc\nd\n
   52:  astore  6
   54:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   57:  aload   6
   59:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   62:  return

আমার প্রশ্নটি আরও স্পষ্ট করতে আমি পারফরম্যান্স নিয়ে মোটেই উদ্বিগ্ন নই। আমি রক্ষণাবেক্ষণযোগ্যতা এবং ডিজাইনের সমস্যা সম্পর্কে উদ্বিগ্ন।

এটিকে যতটা সম্ভব পরিষ্কার এবং সহজ করুন।

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