2010-05-14 16 views
46

मैंने जावा कोड का उपयोग कर यूनिक्स पर्यावरण में एक टेक्स्ट फ़ाइल बनाई है।जावा में कैरिज रिटर्न लाइन फीड

टेक्स्ट फ़ाइल लिखने के लिए मैं java.io.FileWriter और BufferedWriter का उपयोग कर रहा हूं। और प्रत्येक पंक्ति के बाद नई लाइन के लिए मैं bw.newLine() विधि का उपयोग कर रहा हूं (जहां bwBufferedWriter का ऑब्जेक्ट है)।

और मैं यूनिक्स पर्यावरण से मेल में संलग्न करके उस टेक्स्ट फ़ाइल को भेज रहा हूं (स्वचालित रूप से यूनिक्स कमांड का उपयोग करके)।

मेरी समस्या यह है कि, जब मैं विंडोज सिस्टम में मेल से टेक्स्ट फ़ाइल डाउनलोड करता हूं, तो यदि मैं उस टेक्स्ट फ़ाइल को खोलता हूं तो डेटा ठीक तरह से गठबंधन नहीं होता है। newline() चरित्र काम नहीं कर रहा है, मुझे ऐसा लगता है।

मैं यूनिक्स पर्यावरण में समान टेक्स्ट फ़ाइल संरेखण चाहता हूं, अगर मैंने विंडोज वातावरण में टेक्स्ट फ़ाइल भी खोली है।

मैं समस्या का समाधान कैसे करूं?

जावा आपके संदर्भ (यूनिक्स वातावरण में चल रहा है) के लिए नीचे दिए गए कोड:

File f = new File(strFileGenLoc); 
BufferedWriter bw = new BufferedWriter(new FileWriter(f, false)); 
rs = stmt.executeQuery("select * from jpdata"); 
while (rs.next()) { 
    bw.write(rs.getString(1)==null? "":rs.getString(1)); 
    bw.newLine(); 
} 
+0

आप पाठ के लिए एक कोड ब्लॉक का इस्तेमाल किया? –

+0

क्या फ़ाइल खोलने के लिए लक्ष्य प्रणाली हमेशा खिड़कियां होगी, या यह अलग-अलग होगी? –

उत्तर

56

जावा केवल उस प्लेटफार्म के बारे में जानता है जो वर्तमान में चल रहा है, इसलिए यह आपको केवल उस मंच पर प्लेटफॉर्म-निर्भर आउटपुट दे सकता है (bw.newLine() का उपयोग करके)। तथ्य यह है कि आप एक विंडोज़ सिस्टम पर इसे खोलने का मतलब है कि आप या तो इसे का उपयोग (आपके द्वारा लिखी गई कुछ का उपयोग कर, या unix2dos की तरह एक प्रोग्राम का उपयोग) से पहले फ़ाइल को रूपांतरित करने के लिए है, या आप उत्पादन करने के लिए खिड़कियों प्रारूप गाड़ी रिटर्न के साथ फ़ाइल है यह मूल रूप से आपके जावा प्रोग्राम में है। तो अगर आप फ़ाइल पता हमेशा एक विंडोज़ मशीन पर खोला जाएगा, आप उत्पादन करना होगा

bw.write(rs.getString(1)==null? "":rs.getString(1)); 
bw.write("\r\n"); 

यह ध्यान देने योग्य है कि आप है कि दोनों प्लेटफार्मों पर सही दिखेगा एक फ़ाइल उत्पादन करने में सक्षम हो नहीं जा रहे हैं लायक है अगर यह सिर्फ सादा पाठ का उपयोग कर रहे है, तो आप एचटीएमएल का उपयोग कर अगर यह एक ईमेल, या एक्सएमएल है अगर यह डेटा है पर विचार कर सकते। वैकल्पिक रूप से, आप उस डेटा पढ़ता है और उसके बाद मंच है कि दर्शक उपयोग कर रहा है के लिए यह प्रारूप ग्राहक किसी तरह का पड़ सकता है।

+6

विंडोज पर अंत लाइन अनुक्रम सीआर वामो, नहीं वामो सीआर है, इसलिए मैं 'br.write है कि बदल जाएगा के लिए धन्यवाद देते हैं ("\ r \ n"); '('\ n \ r' के बजाय)। – Jesper

+0

@Jesper - धन्यवाद, मैं इसे तदनुसार अपडेट कर दिया गया है, मुझे पता था कि यह वहाँ या आस –

+1

था अगर मैं एक विंडोज सिस्टम में एक ही कोड चलाने के लिए, मैं एक ही पाठ फ़ाइल प्राप्त होगा? या क्या टेक्स्ट फ़ाइल में अब \ \ r \ r \ n' होगा (दूसरा '\ r' विंडोज जावा से' \ n' '\ r \ n' तक बढ़ रहा है)? – ADTC

6

विधि newLine() एक मंच संगत नई लाइन जोड़ दिया जाता है (पुराने Macs के लिए डॉस, 0Dh के लिए 0Dh 0Ah, 0Ah यूनिक्स के लिए सुनिश्चित करता है/लिनक्स)। जावा को यह जानने का कोई तरीका नहीं है कि आप किस प्लेटफ़ॉर्म को टेक्स्ट भेजने जा रहे हैं। इस रूपांतरण को मेल भेजने वाली संस्थाओं द्वारा देखभाल की जानी चाहिए।

+0

मैं आपको नहीं मिल रहा हूं। क्या आप इसे समझा सकते हैं। – Manu

+1

मान लीजिए कि आप लिनक्स में अपने पसंदीदा संपादक के साथ एक टेक्स्ट संपादित करते हैं। जब आप एंटर दबाते हैं तो यह क्या होगा? यह एक नया लाइन चरित्र जोड़ देगा। ऐसा करने से पहले, वह खुद से पूछेगा: मेरा न्यूलाइन कैरेक्टर क्या है? लिनक्स होने के नाते वह जवाब देगा: '0 एएच' बिल्कुल। यदि आप एक विंडोज़ मशीन के लिए इस पाठ भेजते हैं, तो खिड़कियों मशीन परिवर्तित करने की जिम्मेदार है '' 0Ah' 0Dh 0Ah' अन्यथा टेक्स्ट देख नहीं बहुत मजेदार हो जाएगा करने के लिए। – nc3b

+0

@ जेम्स: वर्तमान में लक्ष्य प्रणाली विंडोज है। लेकिन यह कुछ समय बाद भिन्न हो सकता है। किसी भी मदद की सराहना की जाएगी। – Manu

2

bw.newLine(); सभी सिस्टम के साथ संगतता सुनिश्चित नहीं कर सकता है।

यदि आप सुनिश्चित हैं कि यह विंडोज़ में खोला जा रहा है, तो आप इसे विंडोज़ न्यूलाइन पर प्रारूपित कर सकते हैं।

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

यदि आप यूनिक्स कमांड का उपयोग नहीं कर रहे हैं और इसे जावा में करना पसंद करते हैं, तो `` bw.write ("\ r \ n") 'का उपयोग करें और यदि यह आपके प्रोग्राम को जटिल नहीं करता है, तो एक तरीका है जो पता लगाता है ऑपरेटिंग सिस्टम और उपयुक्त न्यूलाइन लिखता है।

+0

@james: मैं bw.write ("\ r \ n") के साथ प्रयास कर रहा हूं; एक बार किया जाने तुम लोगों k जाएगा ... अब – Manu

+0

हाय मित्र का .. समय ..for अपनी कार्यशील मैं इसे इस्तेमाल करेंगे जा रहा है। किसी अन्य समाधान available..please मुझे पता है .... – Manu

+0

सभी प्रयासों – Manu

2

अगर मैं तुम्हें सही समझते हैं, हम एक पाठ फ़ाइल लगाव के बारे में बात करते हैं। दुर्भाग्यपूर्ण है क्योंकि अगर यह ईमेल का संदेश निकाय था, तो आप हमेशा "\ r \ n" का उपयोग कर सकते हैं, http://www.faqs.org/rfcs/rfc822.html

लेकिन जैसा कि यह एक अनुलग्नक है, आपको सिस्टम अंतर के साथ रहना चाहिए। का उपयोग करते हुए "\ r \ n" के रूप में लाइन अंत तक

क) केवल समर्थन खिड़कियों ग्राहकों: यदि मैं अपने जूते में थे, मैं उन विकल्पों में से एक का चयन करेंगे।

ख) दो लगाव फ़ाइलें, linux प्रारूप के साथ एक और खिड़कियों प्रारूप के साथ एक प्रदान करते हैं।

ग) लगाव लोगों या मशीनों के द्वारा पढ़ा जा करने के लिए है अगर मैं नहीं जानता, लेकिन अगर यह लोग है मैं सादे पाठ के बजाय एक HTML फ़ाइल संलग्न पर विचार करेंगे। अधिक पोर्टेबल और बहुत खूबसूरत, बहुत :)

3

जो अपनी फ़ाइल पर लग रहा है पता नहीं है, लेकिन अगर आप यह नोटपैड के बजाय वर्डपैड में खोलते हैं, तो लाइनब्रेक सही दिखाई देगा। यदि आप एक विशेष फ़ाइल एक्सटेंशन का उपयोग कर रहे हैं, तो इसे वर्डपैड से संबद्ध करें और आप इसके साथ काम कर रहे हैं। या किसी भी अन्य उन्नत पाठ संपादक का उपयोग करें।

0

, अपने लेखक चार प्रतिस्थापन प्रदान करने के लिए समाहित इस तरह:

public class WindowsFileWriter extends Writer { 

    private Writer writer; 

    public WindowsFileWriter(File file) throws IOException { 
     try { 
      writer = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-15"); 
     } catch (UnsupportedEncodingException e) { 
      writer = new FileWriter(logfile); 
     } 
    } 

    @Override 
    public void write(char[] cbuf, int off, int len) throws IOException { 
     writer.write(new String(cbuf, off, len).replace("\n", "\r\n")); 
    } 

    @Override 
    public void flush() throws IOException { 
     writer.flush(); 
    } 

    @Override 
    public void close() throws IOException { 
     writer.close(); 
    } 

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