2014-05-17 4 views
8

मैं सिर्फ प्रश्नों के माध्यम से देख रहा था, और मुझे System.getProperty(line.separator)\n के स्थान पर लेखक की टिप्पणी के साथ उपयोग किया गया था कि कोड "पोर्टेबल" था। विभिन्न मंचों के माध्यम से पढ़ना, मैं दो समूहों को देखा है: n और r हर जगह काम करने लगते हैं। लाइन क्यों है। सेपरेटर अधिक पोर्टेबल?

  1. जो लोग वहाँ लिनक्स और न्यू लाइन पात्रों में से विंडोज 'व्याख्या में अंतर होता है कहते हैं, और यह है कि के लिए क्षतिपूर्ति (कोई स्पष्ट सबूत के साथ)।
  2. लोग जो कहते हैं कि कोड और आउटपुट उदाहरण दिखाकर कोई अंतर नहीं है, जो स्पष्ट रूप से केवल उस कोड उदाहरण पर लागू होता है और सार्वभौमिक रूप से नहीं।

मेरी भावना है: यह शायद गैर-मानक ओएस है, उदाहरण के लिए आपकी कंपनी के औद्योगिक स्कैनर ओएस उदाहरण के लिए, जहां आप एक अंतर देखेंगे। मुझे \n और line.separator के बीच अंतर देखने जा रहा है? क्या आप एक उदाहरण दिखा सकते हैं, कृपया? आप यह जानने के लिए कैसे गए कि विविधता कहां होती है?

+0

'\ n' के साथ,' \ r' के साथ 'और \ n \ r' के साथ लाइन टेक्स्ट के रूप में कई टेक्स्ट फ़ाइलों को लिखने का प्रयास करें, अंतर को देखने के लिए विंडोज़ पर नोटपैड में इसे खोलें – MadProgrammer

+0

विंडोज और यूनिक्स वास्तव में लाइन के अंत के लिए अलग कोड। यह अंतर खपत आवेदन के आधार पर खुद को प्रकट नहीं करेगा या नहीं करेगा। –

+5

लाइन नेटवर्क विभाजक कुछ नेटवर्क प्रोटोकॉल में भी बहुत महत्वपूर्ण हैं। मानकों का सम्मान करना सबसे अच्छा है। – Palpatim

उत्तर

8

गलत रेखा समाप्ति अक्सर परेशानी होती है। उदाहरण के लिए, यह है कि क्या विंडोज नोटपैड से पता चलता है जब \n बजाय \r\n (विंडोज 'line.separator) के साथ एक फ़ाइल लेखन है:

Notepad with boxes instead of line breaks

उन छोटे बक्से पंक्ति विराम होना चाहिए थे।

दूसरी तरह के आसपास, जब \r\n\n (यूनिक्स 'line.separator) के स्थान पर प्रयोग किया जाता है, जिस तरह से भी बदतर है, और टूट जाता है अजीब और अद्भुत तरीकों से स्क्रिप्ट और config फाइल को शेल।

उदाहरण के लिए, यह है कि क्या डेबियन पर sh आउटपुट और व्युत्पन्न distros जब कि सिर्फ ls लेकिन साथ \r\n पंक्ति विभाजक शामिल (क्योंकि गाड़ी वापसी टर्मिनल लाइन के कुछ हिस्सों के ऊपर लिख करने का कारण बनता इसे मिटाया लग एक खोल स्क्रिप्ट चलाने के लिए कोशिश कर रहा है):

: not foundsh: ls 

कई ऐसे here, here और here के रूप में लोगों से StackOverflow पर प्रतिदिन सवाल इस ने काट लिया जा रहा है, कर रहे हैं।

+0

"डॉस प्रारूप फ़ाइल से" ls' चलाएं "का अर्थ कुछ भी नहीं है। – dfeuer

+0

@ dfeuer मैं इसे फिर से लिखता हूं, लेकिन आपने विशेष रूप से क्या किया? –

+0

आसानी से समझने के लिए पर्याप्त संदर्भ नहीं है कि इसका क्या अर्थ है। जाहिर है, आपका मतलब "एक बोर्न शेल स्क्रिप्ट के रूप में स्ट्रिंग '" ls \ r \ n "' वाली फाइल को संसाधित करता था, लेकिन इसके बजाय आपने फ़ाइल से कुछ चलाने के बारे में बात की थी, जिसका अर्थ विशेष रूप से कुछ भी नहीं है। – dfeuer

6

यदि आपको यह गलत लगता है, तो आप अन्य एप्लिकेशन के साथ डेटा का आदान-प्रदान करने की अपनी क्षमता को गड़बड़ कर देंगे। आपको यह समझने की आवश्यकता है कि जब आप यह समझने से दूर हो सकते हैं कि जावा आपकी मदद करेगा ... और जब आप नहीं कर सकते।

लिनक्स अनुप्रयोग आमतौर पर केवल लाइनफीड वर्ण (\ n) का उपयोग लाइन लाइन ब्रेक के रूप में करते हैं। विंडोज अनुप्रयोग लाइन फीड (\ n \ r) के बाद कैरिज रिटर्न के संयोजन का उपयोग करते हैं।

यदि आप उच्च स्तरीय जावा I/O दिनचर्या का उपयोग कर रहे हैं - यदि आप रीडर और राइटर्स के माध्यम से जा रहे हैं जो निम्न स्तर के स्ट्रीम और विशेष रूप से बाइट स्ट्रीम के बजाय पात्रों को संसाधित करते हैं - पुस्तकालय अनुवाद करेंगे \ n (जो जावा, सम्मेलन द्वारा, आंतरिक रूप से अपनी नई लाइन के रूप में उपयोग करता है) मंच-उपयुक्त प्रतिनिधित्व में। यदि आप निचले स्तर के कार्यों का उपयोग कर रहे हैं, तो आपको उस भेद के बारे में पता होना चाहिए और सही चीज करना चाहिए।

10

यहाँ ओएस द्वारा मानक पंक्ति विभाजक है:

Windows: '\r\n' 
Mac (OS 9-): '\r' 
Mac (OS 10+): '\n' 
Unix/Linux: '\n' 

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

+0

विचित्र रूप से, ग्लास्गो हास्केल मूल पाठ I/O लाइब्रेरी आधुनिक सम्मेलन, \ "\ n" ', और विंडोज सम्मेलन, \" \ r \ n "', लेकिन पुरानी '\ r" 'मैक सम्मेलन। – dfeuer

+0

यह वास्तव में एक अच्छा जवाब है। मुझे उदाहरण पसंद हैं: उद्धरण और छवि। मुझे अभी भी लगता है कि यह जानना अच्छा होगा: विशेष रूप से रेखाएं खींची जाती हैं (क्योंकि मुझे जावा के साथ विंडोज़ में '\ n' का उपयोग करके किसी भी समस्या का सामना नहीं हुआ है), और मैं यह जानकारी कैसे प्राप्त कर सकता हूं। –

+0

मुझे उत्तर का विस्तार करने की कोशिश करने में प्रसन्नता हो रही है, लेकिन "वास्तव में रेखाएं कहां खींची गई हैं" से आपका क्या मतलब है? जैसा कि केशलम ने अपने उत्तर में कहा था, कुछ उच्च स्तरीय कोड पर्यावरण के लिए लागू न्यूलाइन चरित्र में \ n' को सही ढंग से परिवर्तित कर देंगे, लेकिन यदि आपको लगता है कि आप संभावित रूप से कई प्लेटफ़ॉर्म पर चलाना चाहते हैं, तो आप बेहतर नहीं हैं उस व्यवहार पर भरोसा करते हैं और केवल वैश्विक लाइन विभाजक प्रतिनिधित्व का उपयोग करते हैं। जहां तक ​​मुझे पता है कि वहां कोई व्यापक दस्तावेज नहीं है कि वे कहां होंगे और आपके लिए अन्यथा परिवर्तित नहीं होंगे। –

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