2010-12-14 7 views
6

सभी,java.net.URLConnection.guessContentTypeFromStream और पाठ/सादे

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

कभी-कभी, मुझे बाइनरी फाइलें मिलती हैं। जाहिर है, एक फ़ाइल जो टेक्स्ट-जैसी नहीं है, इस प्रतिस्थापन को नहीं किया जाना चाहिए, क्योंकि \ n के अनुरूप होने वाला मान स्पष्ट रूप से \ n \ n चीजों को खराब तरीके से उलझाने के बिना चुपचाप नहीं किया जा सकता है।

मैं java.net.URLConnection.guessContentTypeFromStream का उपयोग करने का प्रयास कर रहा हूं और यदि टेक्स्ट टेक्स्ट/सादा है तो केवल एंडलाइन रूपांतरण कर रहा हूं। दुर्भाग्यवश, "text/plain" रिटर्न मूल्यों के अपने भाग्य में प्रतीत नहीं होता है; मुझे अपने फ्लैट टेक्स्ट फ़ाइलों के लिए null मिल गया है, और यह संभवतः सुरक्षित नहीं है कि सभी अज्ञात फ़ाइलों को संशोधित किया जा सके।

क्या बेहतर लाइब्रेरी (अधिमानतः सार्वजनिक मेवेन रिपोजिटरी और ओपन-सोर्स में) क्या मैं ऐसा करने के लिए उपयोग कर सकता हूं? वैकल्पिक रूप से, मैं अनुमान कैसे कर सकता हूं सामग्री के लिए मेरे लिए काम कर सकते हैं? मुझे पता है कि मैं एक स्वाभाविक रूप से खतरनाक अनुप्रयोग का वर्णन कर रहा हूं और कोई समाधान सही नहीं हो सकता है, लेकिन क्या मुझे "शून्य" का इलाज "पाठ/सादा" होने की संभावना है और मुझे बस इतना सबूत लिखने की आवश्यकता है कि यह सबूत है कि यह नहीं है 'टी?

+2

"गैमट" के लिए +1। – skaffman

उत्तर

2

ऐसा लगता है कि आप जो पूछ रहे हैं वह यह निर्धारित करना है कि फ़ाइल टेक्स्ट है या नहीं। को देखते हुए, वहाँ एक समाधान here कि सही लगता है कि:

दी, वह यूनिक्स, बैश और पर्ल लेकिन अवधारणा के बारे में बात कर रही है एक ही है:

जब तक आप फ़ाइल के हर बाइट का निरीक्षण किया, आपको यह 100% नहीं मिल रहा है। और एक बड़ा प्रदर्शन हर बाइट का निरीक्षण करने के साथ मारा जाता है। लेकिन कुछ प्रयोगों के बाद , मैं पर एक एल्गोरिदम पर बस गया जो मेरे लिए काम करता है। मैं पहली पंक्ति की जांच करता हूं और फ़ाइल को द्विआधारी होने की घोषणा करता हूं यदि मुझे एक गैर-पाठ बाइट का सामना करना पड़ता है। ऐसा लगता है कि यह थोड़ा ढीला लगता है, मुझे पता है, लेकिन मुझे इससे दूर लगता है।

संपादित करें # 1:
समाधान के इस प्रकार विस्तार करते हुए, यह एक उचित दृष्टिकोण की तरह लगता है फ़ाइल सुनिश्चित करने के लिए किया जाएगा कोई गैर- ASCII वर्ण (शामिल जब तक आप फ़ाइलों है कि गैर हैं साथ काम कर रहे -अंग्रेजी ... एक और समाधान है)। इस जाँच के द्वारा किया जा सकता है अगर एक स्ट्रिंग के रूप में फ़ाइल की सामग्री इस से मेल नहीं खाता:

// -- uses commons-io 
String fileAsString = FileUtils.readFileToString(new File("file-name-here")); 
boolean isTextualFile = fileAsString.matches(".*\\p{ASCII}+.*"); 

संपादित करें # 2
आप अपने regex, या यह के करीब कुछ के रूप में इस का उपयोग करना चाहेंगे। हालांकि, मैं मानता हूं कि यह कुछ परिष्करण का उपयोग कर सकता है।

".*(?:\\p{Print}|\\p{Space})+.*" 
+0

मैं इस तरह के एक दृष्टिकोण का उपयोग करने जा रहा था अगर सभी अन्य विफल हो गए, तो रेगेक्स से बहुत कम गहराई से छोड़कर। (बाइट-बाय-बाइट निरीक्षण, मैं आ गया हूं!) एक लाइन के बजाय, मैं शायद एक निश्चित चार गिनती का उपयोग करूंगा, अधिकांशतः मेरे बुफर्ड रीडर पर मेरे निशान (...) की स्थिति को ओवरराउन करने का जोखिम नहीं उठाता।यह एक सिरदर्द-प्रेरित चरित्र वर्ग है, हालांकि; जावा फॉर्म क्या है, हम में से उन लोगों के लिए जो पर्ल नहीं बोलते हैं? –

+1

मुझे आश्चर्य है कि यह यूनिकोड बीओएम के साथ टेक्स्टफाइल पर कैसे कार्य करता है। – BalusC

+0

निर्दिष्ट नियमित अभिव्यक्ति थोड़ा सहिष्णु थे, लेकिन अग्रणी और पीछे हटना। * (हम वर्ग के बाहर के पात्रों को अयोग्य घोषित करना चाहते हैं!) ने किया। धन्यवाद। –