मुझे प्लेटफ़ॉर्म-निर्भर नई लाइन चरित्र कैसे मिल सकता है?


542

मुझे जावा में एक प्लेटफ़ॉर्म-निर्भर न्यूलाइन कैसे मिलेगी? मैं "\n"हर जगह उपयोग नहीं कर सकता ।


कृपया स्वीकृत उत्तरों को बदलने पर विचार करें। दूसरा उत्तर अधिक उपयुक्त है।
ग्रे

जवाबों:


363

Line.separator संपत्ति के अलावा, यदि आप जावा 1.5 या उसके बाद और प्रयोग कर रहे हैं String.Format (या अन्य स्वरूपण विधि) का उपयोग कर सकते %nमें के रूप में

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

देखें फ़ॉर्मेटर के लिए जावा 1.8 एपीआई अधिक जानकारी के लिए।


7
धन्यवाद! मुझे यकीन है कि System.getProperty ("line.separator"); इसके उपयोग हैं, लेकिन मैं देखकर थक गया हूं: "लाइन 1" + System.getProperty ("line.separator") + "लाइन 2"
Buttons840

43
ओह माय, "लाइन 1" + System.getProperty ("लाइन.सेपरेटर") + "लाइन 2" वास्तव में सबसे बदसूरत चीजों में से एक है जिसे मैंने कभी देखा है। बस कहीं और एक निरंतर घोषित करना कम दर्दनाक होगा।
अबाहगट

4
यह काम नहीं करता है, कम से कम, एक स्ट्रिंग के साथ एक log4j स्टेटमेंट में जा रहा है। अंत में एक नई पंक्ति के साथ एक उदाहरण बनाना संभवतः समस्या को छिपा रहा है। इसके अलावा, स्ट्रिंग s2 सिर्फ '%% n' का उपयोग करके भ्रमित कर रहा है
चुपके रब्बी

6
यदि आपका स्ट्रिंग %उपयोगकर्ता इनपुट से हो सकता है, तो इसका उपयोग न करें !
कॉन्स्टेंटिन वीट्ज

8
@KonstantinWeitz, की समस्या String.format(s + "%n")आसानी से हल हो गई है String.format("%s%n", s)। उपयोगकर्ता इनपुट को प्रारूप निकाय के रूप में शामिल करना हमेशा जोखिम भरा होता है (उसी तरह eval())।
फ्रैंकलिन यू

709

जावा 7 में अब एक System.lineSeparator()विधि है।


8
एक ओवरलोड विधि प्रदान करने के लिए उनमें से बहुत अच्छा रहा होगा lineSeperator(int)जो कुछ संख्या में लाइन सेपरेटर लौटाता है, जैसा कि मैं अक्सर खुद को एक बार 2 का उपयोग करके पाता हूं।
कोन

10
@ इस उत्तर के आधार पर :String.join("", Collections.nCopies(5, System.lineSeparator()))
सैमुअल हैमर

4
जावा 11 के साथ:System.lineSeparator().repeat(5)
याकूब जी।

4
@JacobG रोकना बंद करो .. हम में से कुछ अभी भी जावा 7 पर अटके हुए हैं
एंड्रयू टी फिनेल

@AndrewTFinnell मुझे एक बेहतर नौकरी मिलेगी <:-P नहीं कंटेनर -> नहीं जावा 11, इसलिए आप बेहतर वेतन के लिए रह रहे हैं, हम परेशान कर सकते हैं :-D
ऑबर्जिन

649

आप उपयोग कर सकते हैं

System.getProperty("line.separator");

लाइन विभाजक पाने के लिए


4
जावा 7 System.lineSeparator()विवरण जोड़ने की देखभाल इस सवाल का एक निश्चित जवाब है?
ग्रे


31

यह भी संभव है String.format("%n"):।

या String.format("%n").intern()कुछ बाइट्स को बचाने के लिए।


7
यह एलेक्स बी के जवाब के समान है।
Spoike

16
ओह अब मैं इसे देखता हूं। उन्होंने अपने उत्तर के चारों ओर इतना बिना लिखा हुआ सामान लिखा था। ;-)
छत

मैंने ऐसा करने की कोशिश की है, लेकिन जब मैंने नोटपैड में फ़ाइल देखी, तो उसने नई रेखा को नहीं पहचाना।
mr5

1
@ mr5 notepadफ़ाइल की सामग्री को देखने के लिए सही उपकरण नहीं है। का प्रयोग करें hexdumpया od
ceving

@ ऐस करने पर मैं विंडोज के माहौल में हूँ और मुझे उम्मीद थी कि न्यूलाइन का संयोजन होगा\r\n
mr5

22

कॉमन्स-लैंग पुस्तकालय उपलब्ध एक निरंतर क्षेत्र कहा जाता है SystemUtils.LINE_SEPARATOR


19
हां, प्लेटफ़ॉर्म इंडिपेंडेंट नई लाइन पाने के लिए थर्ड पार्टी लाइब्रेरी स्थापित करें! # प्रजापल्म
शेरविन असगरी

23
@ शेरविन निश्चित रूप से आप ऐसा नहीं करेंगे, लेकिन मैंने जिन परियोजनाओं पर काम किया है, वे पहले से ही कॉमन्स-लैंग और जावा के कुछ पुराने संस्करण का उपयोग कर रहे हैं। इसलिए यदि आप पहले से ही कॉमन्स-लैंग का उपयोग कर रहे हैं तो यह एक समझदार उत्तर है। मुझे यह इंगित करना आवश्यक नहीं लगा कि मैं स्पष्ट रूप से गलत था।
lexicalscope

2
यह उन परियोजनाओं के लिए वास्तव में एक अच्छा सुझाव है जो पहले से ही इस पुस्तकालय का उपयोग कर रहे हैं, धन्यवाद!
एलेक्सिस लेक्लर

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

उपरोक्त स्निपेट में प्लेटफ़ॉर्म की परवाह किए बिना एक नई लाइन के दो तार होंगे।


13

यदि आप किसी फ़ाइल पर लिख रहे हैं, तो एक BufferedWriterइंस्टेंस का उपयोग करके , newLine()उस इंस्टेंस की विधि का उपयोग करें । यह एक फ़ाइल में नई लाइन लिखने के लिए एक प्लेटफ़ॉर्म-स्वतंत्र तरीका प्रदान करता है।



-3

स्ट्रिंग + स्ट्रिंग आदि का उपयोग करके तार लगाने से बचें, इसके बजाय स्ट्रिंगबर्ल का उपयोग करें।

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
यह वास्तव में ज्यादातर मामलों में मायने नहीं रखता है, कोडिंग हॉरर के जेफ एटवुड ने इस विशेष प्रकार के सूक्ष्म अनुकूलन के बारे में एक ब्लॉग पोस्ट किया । हमेशा "न करें string + string" जैसे दावे करने से पहले मेट्रिक्स करें ।
Spoike

6
मैं कहूंगा कि जेफ का लेख थोड़ा हटकर हो सकता है क्योंकि यह केवल निष्पादन के समय को छूता है। जावा में स्ट्रिंग संघनन न केवल निष्पादन की गति के बारे में है, बल्कि जीसी को साफ करने के लिए आप स्मृति में कितना कचरा छोड़ते हैं, जिसके परिणामस्वरूप जीसी अधिक बार चल सकता है। यह आपके पर्यावरण और कॉन्फ़िगरेशन के आधार पर एक समस्या हो सकती है या नहीं भी हो सकती है।
लाजिक

7
लाजिक, मुझे संदेह है कि सभी मामलों के लिए पूर्व-अनुकूलन है, सिवाय उन लोगों के जो वास्तव में बहुत सारे स्ट्रिंग हेरफेर करते हैं। StringBuffer मामूली संघनन आवश्यकताओं के लिए एक विरोधी पैटर्न है। कई मामलों में मैं पठनीय बहु पंक्ति उदाहरण की तुलना में पठनीय String1 + विभाजक + String2 होगा। इसके अलावा, मैं यह परीक्षण करने का सुझाव दूंगा कि क्या मेमोरी और जीसी को एसबी जोड़कर सकारात्मक रूप से प्रभावित किया जाता है। कई मामलों में मुझे लगता है कि यह नहीं है। यदि यह परीक्षण के लायक नहीं है, तो यह संभवतः पूर्व-अनुकूलन है और मैं पठनीयता पर ध्यान केंद्रित करूंगा।
रिचर्ड वाटसन

31
String1 + String2 करना आधुनिक संकलक में नया StringBuilder (String1) .append (String2) करने के समान है, इसलिए एक लाइनर स्ट्रिंग कॉनैट के लिए कोई अनुकूलन नहीं है। StringBuilder केवल छोरों या पुनरावर्ती तरीकों में इसके लायक सामान्य है। लेकिन वैसे भी, यह मूल प्रश्न के दायरे से बाहर हो सकता है।
user327961

@ user327961: सच्ची कहानी। कोई भी आपके पसंदीदा IDE और डीबगर का उपयोग करके इसे आसानी से साबित कर सकता है।
Atmocreations
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.