2013-04-19 8 views
16

मैं जावा में एक प्रोग्राम लिख रहा हूं जो कई प्रकार के आफ्टरस्कूल क्लब (ईजी फुटबॉल, हॉकी - उपयोगकर्ता द्वारा दर्ज) प्रदर्शित करता है। क्लब निम्नलिखित ArrayList में जोड़े जाते हैं:जावा - मैं अपनी ArrayList को एक फ़ाइल में कैसे लिख सकता हूं, और उस फ़ाइल को मूल ArrayList पर पढ़ें (लोड)?

private ArrayList<Club> clubs = new ArrayList<Club>(); 

followng विधि द्वारा:

public void addClub(String clubName) { 
    Club club = findClub(clubName); 
    if (club == null) 
     clubs.add(new Club(clubName)); 
} 

'क्लब' के साथ एक निर्माता एक वर्ग है - नाम:

public class Club { 

    private String name; 

    public Club(String name) { 
     this.name = name; 
    } 

    //There are more methods in my program but don't affect my query.. 
} 

मेरे कार्यक्रम काम कर रहा है - यह मुझे मेरी सरणी सूची में एक नया क्लब ऑब्जेक्ट जोड़ने देता है, मैं सरणी सूची देख सकता हूं, और मैं जो भी चाहता हूं उसे हटा सकता हूं

हालांकि, अब मैं उस सरणीसूची (क्लब) को एक फ़ाइल में सहेजना चाहता हूं, और फिर मैं फ़ाइल को बाद में लोड करने में सक्षम होना चाहता हूं और उसी सरणीसूची फिर से है।

मेरे पास इसके लिए दो तरीके हैं (नीचे देखें), और इसे काम करने की कोशिश कर रहे हैं, लेकिन किसी भी मदद या सलाह की सराहना की जाएगी।

सहेजें विधि (fileName उपयोगकर्ता द्वारा चुना जाता है)

public void save(String fileName) throws FileNotFoundException { 
    String tmp = clubs.toString(); 
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 
    pw.write(tmp); 
    pw.close(); 
} 

लोड विधि (वर्तमान कोड अभ्यस्त चलाने - फ़ाइल एक स्ट्रिंग है लेकिन क्लब होने की जरूरत है

public void load(String fileName) throws FileNotFoundException { 
    FileInputStream fileIn = new FileInputStream(fileName); 
    Scanner scan = new Scanner(fileIn); 
    String loadedClubs = scan.next(); 
    clubs.add(loadedClubs); 
} 

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

,210
+0

आप क्या देख रहे हैं 'क्लब @ c5d8jdj' ऑब्जेक्ट क्लास' 'toString() 'विधि का परिणाम है। आप सूची में सूची को कैसे सहेजना चाहेंगे? क्या प्रारूप? –

+0

toString() फ़ाइल में लिखने के लिए उपयुक्त नहीं है। आप सीरियलाइजेशन चाहते हैं। – Aurand

+0

यदि आप इसे इस तरह से करना चाहते हैं, तो आपको क्लब() कक्षा की toString() विधि को ओवरराइड करना होगा ताकि इसमें सभी जानकारी हो और फिर एक निर्माता, जो ऑब्जेक्ट को फिर से बनाने में सक्षम हो। या Serializable इंटरफ़ेस और ऑब्जेक्टस्ट्रीम पर एक नज़र डालें: http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html – NeplatnyUdaj

उत्तर

8

एक अभ्यास के रूप में, मैं निम्न कार्य सुझाव है:

public void save(String fileName) throws FileNotFoundException { 
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 
    for (Club club : clubs) 
     pw.println(club.getName()); 
    pw.close(); 
} 

यह आपकी फ़ाइल में एक नई लाइन पर प्रत्येक क्लब के नाम लिखेगा।

Soccer 
Chess 
Football 
Volleyball 
... 

मैं तुम्हें करने के लिए लोड हो रहा है छोड़ देंगे। संकेत: आपने एक समय में एक पंक्ति लिखी थी, फिर आप एक समय में एक पंक्ति पढ़ सकते हैं।

जावा में प्रत्येक कक्षा Object कक्षा को बढ़ाती है। इस तरह आप इसके तरीकों को ओवरराइड कर सकते हैं। इस मामले में, आपको toString() विधि से रुचि होनी चाहिए। अपने Club कक्षा में, आप कक्षा के बारे में कुछ संदेश किसी भी प्रारूप में प्रिंट करने के लिए इसे ओवरराइड कर सकते हैं।

public String toString() { 
    return "Club:" + name; 
} 

फिर आप के लिए ऊपर दिए गए कोड को बदल सकता है:,

public void save(String fileName) throws FileNotFoundException { 
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 
    for (Club club : clubs) 
     pw.println(club); // call toString() on club, like club.toString() 
    pw.close(); 
} 
+0

एक छोटे से डेटा सेट के लिए, यह ठीक लगता है लेकिन मुझे बहुत संदेह है कि इसके कुशल ने एक विशाल डेटासेट दिया है। –

0
ObjectOutputStream.writeObject(clubs) 
ObjectInputStream.readObject(); 

इसके अलावा, आप 'जोड़ें' तर्क तार्किक का उपयोग कर के बराबर है एक एक सूची के बजाय सेट करें। सूचियों में डुप्लीकेट हो सकते हैं और सेट नहीं कर सकते हैं। आपको एक सेट का उपयोग करने पर विचार करना चाहिए। आखिरकार, क्या आपके पास वास्तव में एक ही स्कूल में 2 शतरंज क्लब हो सकते हैं?

2

यह काम हो सकता है आप

public void save(String fileName) throws FileNotFoundException { 
FileOutputStream fout= new FileOutputStream (fileName); 
ObjectOutputStream oos = new ObjectOutputStream(fout); 
oos.writeObject(clubs); 
fout.close(); 
} 

वापस पढ़ने के लिए के लिए आप कर सकते हैं

public void read(String fileName) throws FileNotFoundException { 
FileInputStream fin= new FileInputStream (fileName); 
ObjectInputStream ois = new ObjectInputStream(fin); 
clubs= (ArrayList<Clubs>)ois.readObject(); 
fin.close(); 
} 
55

आप जावा के क्रमबद्धता तंत्र में बनाया का उपयोग करना चाहिए। इसका इस्तेमाल करने के लिए आपको निम्न कार्य करने होंगे:

  1. Serializable को लागू करने के रूप में Club वर्ग घोषित:

    public class Club implements Serializable { 
        ... 
    } 
    

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

  2. एक फाइल करने के लिए अपनी सूची लिखने के लिए निम्न करें:

    FileOutputStream fos = new FileOutputStream("t.tmp"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(clubs); 
    oos.close(); 
    
  3. एक फ़ाइल से सूची पढ़ने के लिए, निम्न कार्य करें:

    FileInputStream fis = new FileInputStream("t.tmp"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    List<Club> clubs = (List<Club>) ois.readObject(); 
    ois.close(); 
    
+0

बिल्कुल सही ... धन्यवाद – Noman

+0

यदि आपको "केवल-पढ़ने के लिए फ़ाइल सिस्टम" अपवाद मिल रहा है, तो आप 't.tmp" 'to 'file' को बदल सकते हैं, जहां' फ़ाइल फ़ाइल = नई फ़ाइल (getFilesDir()," t .tmp "); 'या' फ़ाइल फ़ाइल = नई फ़ाइल (getExternalFilesDir (शून्य)," t.tmp "); 'लेकिन बाद वाले को' WRITE_EXTERNAL_STORAGE' अनुमति की आवश्यकता हो सकती है। –

+1

यह सही तरीका है। –

2

जावा 8 आप में Files.write() विधि का उपयोग दो तर्कों के साथ कर सकते हैं: Path और List<String>, इस तरह कुछ:

List<String> clubNames = clubs.stream() 
    .map(Club::getName) 
    .collect(Collectors.toList()) 

try { 
    Files.write(Paths.get(fileName), clubNames); 
} catch (IOException e) { 
    log.error("Unable to write out names", e); 
} 
संबंधित मुद्दे