2013-04-19 41 views
16

Piszę program w Javie, który wyświetla wiele klubów po-przedszkolnych (piłkarska E.G., Hokej - wprowadzane przez użytkownika). Kluby są dodawane do następującego ArrayList:Java - Jak mogę zapisać swoją tablicę ArrayList do pliku i odczytać (wczytać) ten plik do oryginalnej tablicy ArrayList?

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

Przez followng Metoda:

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

'klubu' to klasa z konstruktorem - nazwa:

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

My Program działa - pozwala mi dodać nowy obiekt Club do mojej listy tablic, mogę przeglądać listę i mogę usunąć wszystko, co chcę itp.

Jednak teraz chcę zapisać tę właściwość arrayList (trefle) w pliku, a następnie chcę mieć możliwość późniejszego załadowania pliku i ponownie tę samą listę tablic.

Mam dwie metody na to (patrz poniżej), i starałem się, aby działało, ale nie miał anyluck, każda pomoc lub rada byłaby doceniona.

Zapisz Sposób (nazwa pliku jest wybrany przez użytkownika)

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

metoda obciążenia (Aktualny kod przyzwyczajenie uruchomić - Plik jest ciągiem znaków, ale musi być Klub

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

Jestem również przy użyciu innego? GUI do uruchomienia aplikacji, i w tej chwili mogę kliknąć przycisk Zapisz, co pozwala mi wpisać nazwę i lokalizację i zapisać go.Plik wygląda i może być otwarty w Notatniku, ale wyświetla się jako coś takiego jak Club @ c5d8jdj (dla każdego klubu na mojej liście)

+0

To, co widzisz "Club @ c5d8jdj", jest wynikiem metody "toString()" klasy Object. Jak chcesz, aby lista została zapisana w pliku? Jaki format? –

+0

toString() nie nadaje się do zapisu do pliku. Chcesz serializacji. – Aurand

+0

Jeśli chcesz to zrobić w ten sposób, musisz zastąpić metodę toString() klasy Club(), aby zawierała ona wszystkie informacje, a następnie Konstruktora, który jest w stanie odtworzyć obiekt. Lub spójrz na interfejs Serializable i ObjectStreams: http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html – NeplatnyUdaj

Odpowiedz

8

Jako ćwiczenie, proponuję następujący sposób:

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

To będzie pisać nazwę każdego klubu w nowej linii w pliku.

Soccer 
Chess 
Football 
Volleyball 
... 

Zostawię załadunku do ciebie. Podpowiedź: Napisałeś jedną linię naraz, możesz czytać po jednej linii na raz.

Każda klasa w języku Java rozszerza klasę Object. Jako takie można zastąpić jego metody. W takim przypadku użytkownik powinien być zainteresowany metodą toString(). W klasie Club można ją przesłonić, aby wydrukować wiadomość o klasie w dowolnym formacie.

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

Można wtedy zmienić powyższy kod do:

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

dla małego zestawu danych, wydaje się, że jest ok, ale bardzo wątpię, że jest skuteczny biorąc pod uwagę ogromny zestaw danych. –

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

Ponadto, „dodać” logika jest logicznie równoważne użyciu zestawu zamiast listy. Listy mogą mieć duplikaty, a zestawy nie. Powinieneś rozważyć użycie zestawu. W końcu, czy naprawdę możesz mieć 2 kluby szachowe w tej samej szkole?

2

To może pracować dla Ciebie

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

Aby odczytać z powrotem można mieć

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

Należy użyć Java wbudowany mechanizm serializacji. Aby go użyć, należy wykonać następujące czynności:

  1. zadeklarować klasę Club jako wdrożenie Serializable:

    public class Club implements Serializable { 
        ... 
    } 
    

    Mówi JVM, że klasa może być odcinkach do strumienia. Nie musisz implementować żadnej metody, ponieważ jest to interfejs znacznika.

  2. Aby pisać listy do pliku, wykonaj następujące czynności:

    FileOutputStream fos = new FileOutputStream("t.tmp"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(clubs); 
    oos.close(); 
    
  3. Aby odczytać listy z pliku, wykonaj następujące czynności:

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

Perfect ... Dzięki – Noman

+0

Jeśli otrzymujesz wyjątek "System plików tylko do odczytu", możesz zmienić plik '" t.tmp "' na 'plik', gdzie' Plik file = nowy Plik (getFilesDir(), t .tmp ");' lub 'Plik file = nowy Plik (getExternalFilesDir (null)," t.tmp ");' ale ten drugi może potrzebować uprawnienia 'WRITE_EXTERNAL_STORAGE'. –

+1

To jest poprawna metoda. –

2

W Javie 8 ciebie można użyć metody Files.write() z dwoma argumentami: Path i List<String>, coś takiego:

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