2010-10-27 11 views
6

मैं जावा SE उपयोग कर रहा हूँ 6.क्या जावा में लाइन विभाजक की जांच करने के लिए एक मानक एपीआई है?

मेरे कार्यक्रम यूनिकोड को डॉस से यूनिक्स को लेकर फ़ाइलें और ascii के कई प्रकार पढ़ता है, और मुझे यकीन है कि आउटपुट फ़ाइल के लिए पंक्ति विभाजक इनपुट फ़ाइलों मिलान करने के लिए किया है।

जिस तरह से मैं ऐसा करता हूं, मैंने पहली पंक्ति विभाजक की खोज करने के लिए बुफर्ड रीडर रीड() फ़ंक्शन के साथ एक नमूना रेखा पढ़ी है और उस लाइन विभाजक को स्ट्रिंग में सहेजने के लिए। इस तरह इसे बाद में इस्तेमाल किया जा सकता है जब भी मुझे एक नई लाइन चाहिए।

मैं स्कैनर वर्ग का निरीक्षण किया और देखा संभव पंक्ति विभाजक निम्नलिखित शामिल हो सकते है कि है:

\r\n 
\r 
\n 
\u2028 
\u2029 
\u0085 

इन पात्रों के लिए जाँच करने के लिए एक पुस्तकालय समारोह है? या इससे भी बेहतर, यह जांचने के लिए पहले से ही एक लाइब्रेरी फ़ंक्शन है कि इनपुट लाइन लाइनर कैसा दिखता है?

क्या इसके आसपास कोई और तरीका है?

संपादित करें: यदि संभव हो तो मैं तृतीय पक्ष पुस्तकालयों के बजाय जावा के मानक API का उपयोग करना चाहता हूं, लेकिन सभी सुझावों का स्वागत है।

संपादित करें: बस स्पष्ट करने के लिए।
1) इनपुट फ़ाइलें इस प्रोग्राम पर चल रही है इस पर निर्भर नहीं है। उदाहरण के लिए, यदि मैं डॉस में इस प्रोग्राम को चला रहा हूं, तो भी मुझे यूनिक्स इनपुट फ़ाइल मिल सकती है।
2) मेरा लक्ष्य लाइन विभाजक के साथ सीमित प्रत्येक पंक्ति को पढ़ना नहीं है - यह आसान है। मुझे वास्तव में आवश्यकता है कि इनपुट फ़ाइल के रूप में एक ही लाइन विभाजक के साथ एक आउटपुट फ़ाइल लिखना है। उदाहरण के लिए, यदि मैं डॉस में इस प्रोग्राम को चला रहा हूं, और मुझे यूनिक्स इनपुट फ़ाइल मिलती है, तो मैं यूनिक्स लाइन विभाजक के साथ अपनी आउटपुट फ़ाइल लिखने में सक्षम होना चाहता हूं। यही कारण है कि मैं पूछ रहा हूं कि ओएस चलाने के बजाय, इनपुट फ़ाइलों के आधार पर लाइन विभाजक का पता लगाने के लिए मानक API है या नहीं।

धन्यवाद।

उत्तर

3

पिछले तीन उत्तरों वास्तव में प्रश्न को संबोधित नहीं करते हैं। ओपी किसी दिए गए फ़ाइल से निर्धारित करना चाहता है: इस फ़ाइल में लाइन विभाजक क्या उपयोग किया जाता है?

इस प्रश्न का निश्चित रूप से किसी दिए गए फ़ाइल के लिए उत्तर नहीं दिया जा सकता है, क्योंकि फ़ाइल कई पंक्ति समाप्ति का उपयोग कर सकती है। यह प्रतीत होता है लेकिन यह संभव है।

तो मेरे लिए सबसे अच्छा तरीका इनपुट फ़ाइल को स्वयं पार्स करना है, संभावित लाइन समाप्त होने वाले चरित्र अनुक्रमों की घटनाओं की गिनती करना और इस फ़ाइल के लाइन विभाजक के रूप में अक्सर दिखाई देने वाला एक चुनना।

मैं ऐसी लाइब्रेरी में नहीं आया हूं जो इस कार्यक्षमता को लागू करेगा।

+1

"प्रतीत होता है" - यह निश्चित रूप से एक एज-केस नहीं है, उदाहरण के लिए - मेनफ्रेम प्रतिक्रियाओं के साथ जावा यूनिक्स लॉग फ़ाइलें, या विभिन्न स्रोतों से प्रतिलिपि-चिपकाए गए ग्रंथ। मैं कभी नहीं मानता कि फ़ाइल में केवल एक प्रकार का लाइन विभाजक है। –

1

BufferedReader और readLine() स्वचालित रूप से लाइन मार्कर के अंत के पहले तीन प्रकारों को स्वचालित रूप से संभालता है।

+0

मुझे लगता है कि यह बेहतर समाधान है, उनको \ n और \ r सामान हार्डकोड की आवश्यकता नहीं है। – user1686407

0

मैंने इसके लिए एपीआई के लिए बहुत लंबा समय देखा है। लेकिन नहीं मिला।

मैं रेगेक्स के साथ पहली पंक्ति डेलीमीटर के लिए पढ़ने के लिए एक समान दृष्टिकोण का उपयोग करता हूं।

मुझे काम करने के लिए सही रेगेक्स प्राप्त करने में कुछ समय बिताना पड़ा और कामना की कि इस जवाब के लिए कोड होगा। इसलिए मैंने कुछ लिखना समाप्त कर दिया:

/** 
* <h1> Identify which line delimiter is used in a string </h1> 
* 
* This is useful when processing files that were created on different operating systems. 
* 
* @param str - the string with the mystery line delimiter. 
* @return the line delimiter for windows, {@code \r\n}, <br> 
*   unix/linux {@code \n} or legacy mac {@code \r} <br> 
*   if none can be identified, it falls back to unix {@code \n} 
*/ 
public static String identifyLineDelimiter(String str) { 
    if (str.matches("(?s).*(\\r\\n).*")) {  //Windows //$NON-NLS-1$ 
     return "\r\n"; //$NON-NLS-1$ 
    } else if (str.matches("(?s).*(\\n).*")) { //Unix/Linux //$NON-NLS-1$ 
     return "\n"; //$NON-NLS-1$ 
    } else if (str.matches("(?s).*(\\r).*")) { //Legacy mac os 9. Newer OS X use \n //$NON-NLS-1$ 
     return "\r"; //$NON-NLS-1$ 
    } else { 
     return "\n"; //fallback onto '\n' if nothing matches. //$NON-NLS-1$ 
    } 
} 
संबंधित मुद्दे