2009-12-10 6 views
72

मैं प्रभावी जावा पढ़ रहा हूं और यह हर जगह न्यूलाइन चरित्र के लिए %n का उपयोग करता है। मैंने जावा प्रोग्राम में नई लाइन के लिए \n का सफलतापूर्वक उपयोग किया है।printf में जावा के "% n" के साथ क्या हो रहा है?

कौन सा 'सही' है? \n के साथ क्या गलत है? जावा ने इस सी सम्मेलन को क्यों बदल दिया?

+1

बस एक अनुमान है, लेकिन: क्रॉस-प्लेटफ़ॉर्म समर्थन। विभिन्न सिस्टम न्यूलाइन के लिए अलग-अलग अक्षर का उपयोग करते हैं, उदा। \ n बनाम \ r \ n। सी # में पर्यावरण के लिए एक ही उद्देश्य है। –

+0

जावा में सिस्टम में कुछ भी है, लेकिन% n एक printf में आसान है। –

+0

जावा ने इस सी सम्मेलन को क्यों बदला == +1, :) –

उत्तर

107

एक त्वरित गूगल से:

वहाँ भी एक विनिर्देशक कि एक तर्क के अनुरूप नहीं है है। यह "% n" है जो लाइन ब्रेक आउटपुट करता है। कुछ मामलों में "\ n" का भी उपयोग किया जा सकता है, लेकिन चूंकि "% n" हमेशा सही प्लेटफॉर्म-विशिष्ट लाइन विभाजक आउटपुट करता है, यह प्लेटफॉर्म पर पोर्टेबल है जबकि "\ n" नहीं है।

देखें https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Original source

+3

जहां "सही रेखा विभाजक" काफी हद तक मनमाने ढंग से संदर्भित संदर्भ के आधार पर मनमाना है .. – user2864740

+0

@ user2864740 यह सच है, यह _correct_ प्लेटफ़ॉर्म-विशिष्ट लाइन विभाजक नहीं आउटपुट करता है लेकिन _current_ एक। –

23

%n है पोर्टेबल करवाते प्लेटफार्मों \n नहीं है।

formatting string syntax in the reference documentation देखें:

'एन' लाइन विभाजक परिणाम प्लेटफ़ॉर्म-विशिष्ट लाइन विभाजक है

19

जबकि \n यूनिक्स आधारित प्रणाली, अन्य प्रणालियों के लिए सही न्यू लाइन चरित्र है एक लाइन के अंत का प्रतिनिधित्व करने के लिए विभिन्न पात्रों का उपयोग कर सकते हैं। विशेष रूप से, विंडोज सिस्टम \r\n का उपयोग करता है, और प्रारंभिक मैकोज़ सिस्टम \r का उपयोग करता है।

अपनी प्रारूप स्ट्रिंग में %n का उपयोग करके, आप System.getProperty("line.separator") द्वारा दिए गए मान का उपयोग करने के लिए जावा को बताते हैं, जो वर्तमान सिस्टम के लिए लाइन विभाजक है।

13

चेतावनी: यदि आप नेटवर्क्सिंग कोड कर रहे हैं, तो आप% n के विरोध के रूप में नेटवर्क की अलग-अलग वर्ण भेज सकते हैं, यह निर्भर करता है कि यह किस प्लेटफॉर्म पर चल रहा है।

7

"सही" इस बात पर निर्भर करता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं।

\ n हमेशा आपको "यूनिक्स शैली" लाइन समाप्त करने देगा। \ r \ n हमेशा आपको "डॉस स्टाइल" लाइन समाप्त कर देगा। % n आपको

सी पर चल रहे प्लेटफ़ॉर्म के लिए लाइन समाप्त कर देगा, यह अलग-अलग हैंडल करता है। आप या तो "टेक्स्ट" या "बाइनरी" मोड में फ़ाइल खोलना चुन सकते हैं। यदि आप बाइनरी मोड में फ़ाइल खोलते हैं \ n आपको "यूनिक्स स्टाइल" लाइन समाप्त कर देगा और "\ r \ n" आपको "डॉस स्टाइल" लाइन समाप्त कर देगा। यदि आप फ़ाइल को "टेक्स्ट" मोड में डॉस/विंडोज सिस्टम पर खोलते हैं तो जब आप लिखते हैं \ n फाइल हैंडलिंग कोड इसे \ r \ n में बदल देता है। तो पाठ मोड में एक फ़ाइल खोलकर और \ n का उपयोग करके आप मंच विशिष्ट लाइन समाप्त कर रहे हैं।

मैं देख सकता हूं कि क्यों जावा के डिजाइनर "टेक्स्ट" और "बाइनरी" फ़ाइल मोड के संबंध में सी के हैकी विचारों को दोहराना नहीं चाहते थे।

4

जावा में, \n हमेशा \u000A लाइनफीड वर्ण उत्पन्न करता है। विशेष मंच के लिए सही लाइन विभाजक प्राप्त करने के लिए %n का उपयोग करें।

तो \n का उपयोग करें, जब आपको यकीन है कि आपको \u000A लाइनफ़ेड वर्ण की आवश्यकता है, उदाहरण के लिए नेटवर्किंग में।
अन्य सभी स्थितियों में उपयोग करने %n

1

सूचना इन उत्तरों केवल सच है जब System.out.printf() या System.out.format() या Formatter वस्तु का उपयोग कर रहे हैं। यदि आप System.out.println() में उपयोग करते हैं, तो यह केवल %n का उत्पादन करेगा, न कि एक नई लाइन।

0

% n प्रारूप विनिर्देश एक लाइन विभाजक है जो ऑपरेटिंग सिस्टम में पोर्टेबल है। हालांकि, इसे System.out.print या System.out.println फ़ंक्शंस के लिए तर्क के रूप में उपयोग नहीं किया जा सकता है।

उपरोक्त लाइन विभाजक के इस नए संस्करण का उपयोग करने की हमेशा अनुशंसा की जाती है \ n।

संबंधित मुद्दे