2013-04-19 19 views
16

Java'da bir dizi okul sonrası kulüpleri (E.G. Futbol, ​​Hokey - kullanıcı tarafından girilen) görüntüleyen bir program yazıyorum. kulüpleri aşağıdaki ArrayList içine eklenir: followng YöntemiyleJava - ArrayListimi bir dosyaya nasıl yazabilirim ve bu dosyayı orijinal ArrayList'e okuyabilir (yükleyebilir)?

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

:

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

Kulübü 'bir yapıcı olan bir sınıftır - isim:

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.. 
} 

Benim Program çalışıyor - benim arraylist içine yeni bir Club Object eklemenize izin veriyor, ben arraylist görüntüleyebilir ve ben istediğim herhangi birini silebilirim.

Ancak, şimdi bu arrayList (kulüpler) dosyasını bir dosyaya kaydetmek istiyorum ve daha sonra dosyayı daha sonra yüklemek istiyorum ve aynı arraylist tekrar orada olmak istiyorum.

Bunun için iki yönteme sahibim (aşağıya bakın) ve çalışmayı denemeye çalışıyorum, ancak herhangi bir yardım almamış, herhangi bir yardım ya da öneri takdir edilecektir.

kaydet Yöntemi (fileName kullanıcı tarafından seçilir)

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

Yük yöntemi (Güncel kod çalıştırmak alışkanlık - Dosya bir dizedir ama Kulübü olması gerekiyor ben de bir kullanıyorum

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

? Uygulamayı çalıştırmak için GUI ve şu anda bir isim ve konum yazıp kaydetmeme izin veren Kaydet düğmesine tıklayabilirim. Dosya görünür ve Not Defteri'nde açılabilir ancak Club @ c5d8jdj gibi bir şey olarak görüntülenebilir (listemdeki her Kulüp için

.210
+0

Kullandığınız şey, Club @ c5d8jdj Object sınıfının "toString()" yönteminin sonucudur. Listede dosyanın nasıl kaydedilmesini istersiniz? Hangi format? –

+0

toString() dosyaya yazmak için uygun değil. Seri hale getirme istiyorsun. – Aurand

+0

Bu şekilde yapmak isterseniz, Club() sınıfının toString() yöntemini geçersiz kılmanız gerekir, böylece tüm bilgileri ve sonra nesneyi yeniden oluşturabilen bir Oluşturucu içerir. Veya Serializable arabirimine ve ObjectStreams'e bakın: http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html – NeplatnyUdaj

cevap

8

bir egzersiz olarak, aşağıdakileri yaparak öneririm:

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

Bu dosyada yeni bir satırda her kulübün ismini yazacak.

Soccer 
Chess 
Football 
Volleyball 
... 

sana yükleme bırakacağım. İpucu: Her seferinde bir satır yazdınız, daha sonra her seferinde bir satır okuyabilirsiniz.

Java'daki her sınıf, Object sınıfını genişletir. Bu şekilde kendi yöntemlerini geçersiz kılabilirsiniz. Bu durumda, toString() yöntemiyle ilgilenmeniz gerekir. Club sınıfınızda, sınıfla ilgili mesajınızı istediğiniz herhangi bir biçimde yazdırabilirsiniz.

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

Ardından yukarıdaki kodunu değiştirmek olabilir: mantık kullanarak mantıksal olarak eşdeğerdir Eğer 'ekle', aynı zamanda

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

küçük bir veri seti için, bu iyi görünüyor gibi görünüyor ama ben büyük bir veri kümesi verilen verimli onun çok fazla şüphe ediyorum. –

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

bir yerine listesi ayarlayın. Listelerin kopyaları olabilir ve Kümeler olamaz. Bir set kullanmayı düşünmelisin. Sonuçta, aynı okulda gerçekten 2 satranç kulübünüz var mı?Eğer

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

geri okumak için için

2

Bu

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

Java en serileştirme mekanizması inşa kullanmalıdır olabilir işe yarayabilir. kullanmak için aşağıdakileri yapmanız gerekir:

  1. Serializable uygulama olarak Club sınıfı bildirme:

    public class Club implements Serializable { 
        ... 
    } 
    

    Bu sınıf bir akışa serileştirilebilir JVM söyler. Herhangi bir yöntem uygulamak zorunda değilsiniz, çünkü bu bir işaretçi arabirimidir.

  2. bir dosyaya listenizi yazmak için aşağıdakileri yapın:

    FileOutputStream fos = new FileOutputStream("t.tmp"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(clubs); 
    oos.close(); 
    
  3. bir dosyadan okumak için lütfen aşağıdakileri yapın: Java 8 ayında

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

Mükemmel ... Teşekkürler – Noman

+0

"Salt okunur dosya sistemi" istisnası alıyorsanız, '' t.tmp ''' '' dosya 'ını değiştirebilir, burada' Dosya dosyası = yeni Dosya (getFilesDir(), "t .tmp ") veya' Dosya dosyası = new File (getExternalFilesDir (null), "t.tmp"); ancak ikincisi "WRITE_EXTERNAL_STORAGE" iznine gerek duyabilir. –

+1

Bu, doğru yöntemdir. –

2

iki bağımsız değişkenle Files.write() yöntemini kullanabilir: Path ve List<String>, böyle bir şey:

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); 
}