2011-11-21 26 views
33

संलग्न नहीं कर रहा है निम्न विधि केवल मेरे द्वारा जोड़े गए नवीनतम आइटम को लिखती है, यह पिछले प्रविष्टियों में शामिल नहीं होती है। मैं क्या गलत कर रहा हूं?प्रिंटवाइटर एपेंड विधि

public void addNew() { 
    try { 
     PrintWriter pw = new PrintWriter(new File("persons.txt")); 
     int id = Integer.parseInt(jTextField.getText()); 
     String name = jTextField1.getText(); 
     String surname = jTextField2.getText(); 
     Person p = new Person(id,name,surname); 
     pw.append(p.toString()); 
     pw.append("sdf"); 
     pw.close(); 
    } catch (FileNotFoundException e) {...} 
} 

उत्तर

64

तथ्य यह है कि PrintWriter की विधि append() कहा जाता है इसका मतलब यह नहीं है कि यह फ़ाइल खोला जा रहा के मोड परिवर्तन।

आप संलग्न मोड में फ़ाइल खोलने के लिए और साथ ही जरूरत है:

PrintWriter pw = new PrintWriter(new FileOutputStream(
    new File("persons.txt"), 
    true /* append = true */)); 

भी ध्यान रखें कि फाइल सिस्टम डिफ़ॉल्ट एन्कोडिंग में लिखा जाएगा। यह हमेशा वांछित नहीं है और इंटरऑपरेबिलिटी समस्याओं का कारण बन सकता है, आप स्पष्ट रूप से फ़ाइल एन्कोडिंग निर्दिष्ट करना चाह सकते हैं।

+0

यह नींद की धागा, उस के लिए बहुत माफी जागरण की तरह है। लेकिन मुझे संदेह है। अगर मुझे केवल फाइल ऑब्जेक्ट दिया गया है, तो मैं फ़ाइल में ऑपरेशन कैसे जोड़ूं, और मुझे स्ट्रीम क्लासेस (जैसे FileOutputStream और इसी तरह) का उपयोग करने की अनुमति नहीं है। मुझे क्या अनुमति है: Printwriter pw = new PrintWriter (फ़ाइल); : मैंने संलग्न(), लिखना(), प्रिंट() की कोशिश की। इस परिदृश्य में संलग्न करने के लिए कोई रेडीमेड विधि है। –

+0

एक स्पष्टीकरण के रूप में, प्रिंटवाइटर की 'संलग्न()' विधि इस तथ्य को संदर्भित करती है कि यह लेखक के लिए संलग्न है iee i।ई यह स्वयं का आउटपुटस्ट्रीम है, न कि फाइल के लिए। –

+0

और @ user1707035 के प्रश्न के संदर्भ में, नहीं, ऐसा लगता है कि आप आउटपुटस्ट्रीम ऑब्जेक्ट के निर्माण के बिना इसे प्रिंट करने के लिए प्रिंटवाइटर का उपयोग नहीं कर सकते हैं। ऐसा इसलिए है क्योंकि PrintWriter इसके तत्कालता के समय स्ट्रीम खोलता है, और एकमात्र रचनाकार जो फ़ाइल या फ़ाइल नाम को तर्क के रूप में समर्थन देते हैं, फ़ाइल को 'एपेंड' पैरामीटर के बिना बाहरी रूप से आउटपुटस्ट्रीम ऑब्जेक्ट का निर्माण करके फ़ाइल खोलते हैं। संदर्भ (दस्तावेज़): https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File) –

15
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true)); 

true संलग्न झंडा है। documentation देखें।

9

ओपन संलग्न मोड में फ़ाइल, निम्न कोड के साथ के रूप में:

PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
4

IMHO स्वीकार किए जाते हैं तथ्य यह है कि इस सवाल का जवाब इरादा वर्ण लिखने के लिए विचार नहीं करता। (मैं जानता हूँ कि विषय पुराना है, लेकिन जब से, जबकि एक ही विषय के लिए खोज मैं सलाह दी समाधान खोजने से पहले इस पोस्ट पर ठोकर खाई, मैं यहाँ पोस्ट कर रहा हूँ।)

FileOutputStream docs से, आप FileOutputStream का उपयोग करके ऐसी बाइट्स प्रिंट करना चाहते हैं ।

फ़ाइलऑटपुटस्ट्रीम कच्चे बाइट्स जैसे छवि डेटा लिखने के लिए है। पात्रों की धाराओं को लिखने के लिए, फ़ाइलवाइटर का उपयोग करने पर विचार करें।

इसके अलावा, BufferedWriter docs से:

जब तक शीघ्र उत्पादन के लिए आवश्यक है, यह सलाह दी जाती है किसी भी लेखक हैं, जिनके लिखने() के संचालन के चारों ओर एक BufferedWriter रैप करने के लिए महंगा, इस तरह के FileWriters और OutputStreamWriters के रूप में हो सकता है ।

अंत में, इस सवाल का जवाब निम्नलिखित (उल्लेख किया in this other StackOverFlow post) होगा:

PrintWriter out = null; 
try { 
    out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true))); 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
}finally{ 
    if(out != null){ 
     out.close(); 
    } 
} 

इसके अलावा, जावा 7 के रूप में, आप एक कोशिश के साथ-संसाधनों कथन का उपयोग कर सकते हैं। कोई अंत में ब्लॉक क्योंकि यह स्वचालित रूप से नियंत्रित किया जाता है घोषित संसाधन (रों) को बंद करने के लिए आवश्यक है, और भी कम वर्बोज़ है:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) { 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
} 

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

  • कोई संबंधित समस्या नहीं^_^