Problem z odczytem z pliku ;)

0

Pytanie o odczyt z pliku:

public class Pracownik
{
String imie = JOptionPane.showInputDialog(null,"Podaj Imie:","",JOptionPane.QUESTION_MESSAGE);
}

if(zrodlo==zapis)
{
try{
FileOutputStream pracownicy = new FileOutputStream("pracownicy.txt");
ObjectOutputStream out_pracownicy = new ObjectOutputStream(pracownicy);
out_pracownicy.writeObject(lista_pracownikow.get(0).imie);
out_pracownicy.flush();
pracownicy.close();
}
catch(IOException e)
{
System.out.println("Błąd wejścia/wyjścia.");
}

//Odczyt -----------------------------------------------------------------------
if(zrodlo==odczyt)
{
try{
FileInputStream liczba_pracownikow = new FileInputStream("pracownicy.txt");
ObjectInputStream in = new ObjectInputStream(liczba_pracownikow);
Object ob = in.readObject();//<----- Jako to mam obiekt
System.out.println(ob);
lista_pracownikow.get(0).imie="gk";
}
catch(Exception e)
{
System.out.println("Błąd wejścia/wyjścia.");
}

Problem polega na tym ze: Chce odczytac imie i przypisac go jako atrybut pewnego obiektu t array list obiektów. Tak jak widać:

FileInputStream liczba_pracownikow = new FileInputStream("pracownicy.txt");
ObjectInputStream in = new ObjectInputStream(liczba_pracownikow);
Object ob = in.readObject();//<----- Jako to mam obiekt
System.out.println(ob);
Odczytuje super, widac imie ale nie wiem jak przypisac to co odczyta do arraylisty:
Chciałbym w to miejsce lista_pracownikow.get(0).imie="gk"; zamiast "gk" przypisac odczytany z pliku obiekt ok.

Prosze o pomoc, ktytyka tez sie przyda ;)

0

Musisz użyć rzutowania

String imie = (String) in.readObject();
System.out.println(imie);
lista_pracownikow.get(0).imie=imie;
0

No jakoś nadal nie działa ;/ Może inne pomysły?

0

String imie = (String) in.readObject();
System.out.println(imie);
lista_pracownikow.get(0).imie=imie;

niby działa kompilator nie zglasza bledow Ale program sie nie wykonuj wywala na lini:
lista_pracownikow.get(0).imie=imie;
Jak sprawdziam to do Stringa nazwa jest przypisane Nie wiem dlaczego nie chce jej zapisac tu:
lista_pracownikow.get(0).imie=imie;

0

Trochę namotałeś z tym zadaniem. Masz kolekcję ArrayList pracowników. Chcesz taką kolekcję zapisać do pliku aby później ją odczytać i przetworzyć w jakiś tam sposób. Powinieneś tworzyć klasy tak aby nie były zależne od prezentacji. Najlepiej też nie tworzyć pól publicznych. Przykład klasy pracownik niezależnej od metody prezentacji danych:

public class Employee{
	private String _name;
	
	public Employee(String name) {
		this._name = name;
	}
	
	public String getName() {
		return this._name;
	}
	
	public void setName(String name) {
		this._name = name;
	}
	
	public String toString() {
		return this._name;
	}
}

Teraz gdy już mamy obiekt pomyślmy jak można by go sensownie zapisać go w pliku. Najlepiej rozpatrywać od razu zapis kolekcji takich obiektów, bo wiemy, że takich obiektów w naszej aplikacji będzie bardzo dużo. Stwórzmy sobie do tego klasę, której zadaniem będzie zapis kolekcji obiektów do pliku oraz odczyt takiego pliku. Aby nie ograniczać naszej klasy do konkretnej implementacji kolekcji użyjemy interfejsu Collection do implementacji tej logiki.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;

public final class EmployeeListDecorator {
	public static boolean saveList(Collection<Employee> personnel, String fileName) {
		PrintWriter writer = null;
		try{
			writer = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
			for (Employee employee : personnel) {
				writer.println(employee.getName());
			}
			return true;
		} catch(IOException exc) {
			exc.printStackTrace();
			return false;
		} finally {
			if(writer != null) {
				writer.flush();
				writer.close();
			}
		}
	}
	
	public static Collection<Employee> readList(String fileName) {
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(new File(fileName)));
			ArrayList<Employee> list = new ArrayList<Employee>();
			String line = null;
			while((line = reader.readLine()) != null) {
				list.add(new Employee(line));
			}
			return list;
		} catch(IOException exc) {
			exc.printStackTrace();
			return null;
		} finally {
			if(reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

Zapisywanie do pliku oraz odczyt jest teraz trywialny:

import java.util.ArrayList;

public class Program {

	static public void main(String args[]) {
		final String fileName = "j:\\test.txt";
		//Tworzymy dane.
		ArrayList<Employee> personnel = new ArrayList<Employee>();
		personnel.add(new Employee("Adam"));
		personnel.add(new Employee("Łukasz"));
		personnel.add(new Employee("Rafał"));
		//Zapisujemy dane do pliku.
		if(EmployeeListDecorator.saveList(personnel, fileName)){
			System.out.println("Zapisalem liste pracownikow...");
		} else {
			System.out.println("Nie udalo sie zapisac listy pracownikow.");
			return;
		}
		//Wczytujemy dane z pliku.
		personnel = new ArrayList<Employee>(EmployeeListDecorator.readList(fileName));
		//Wyswietlamy wczytane dane.
		if(personnel == null) {
			System.out.println("Nie udalo sie odczytac listy pracownikow.");
		} else {
			System.out.println("Odczytana lista pracownikow:");
			for (Employee employee : personnel) {
				System.out.println(employee.toString());
			}
		}
	}
}
0

Działa super;) wielkie dzięki. Ale ma jeszcze jedno pytanie Co powinienem zrobić aby dodać za kolejne zmienne w clasie. Jak nazwisko. Przerobielem to do swoich potrzeb:

public class Apteka
{
String _nazwa,_miasto;
String nazwa,miasto;

public Apteka(String _nazwa,String _miasto) {this._nazwa = _nazwa; this._miasto = _miasto;}

}

public String getName() {return this._nazwa;}
public String getMiasto() {return this._miasto;}
public void setName(String _nazwa) {this._nazwa = _nazwa;}
public void setMiasto(String _nazwa) {this._miasto = _miasto;}
public String toString() {return this._nazwa;}
public String toString2() {return this._miasto;}
}

No i twoja klasa:

public final class EmployeeListDecorator2 {
public static boolean saveList(Collection<Apteka> apteki, String fileName) {
PrintWriter writer = null;
try{
writer = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
for (Apteka apteka : apteki) {
writer.println(apteka.getName());
writer.println(apteka.getMiasto());
}
return true;
} catch(IOException exc) {
exc.printStackTrace();
return false;
} finally {
if(writer != null) {
writer.flush();
writer.close();
}
}
}

    public static Collection<Apteka> readList(String fileName) {
            BufferedReader reader = null;
            try {
                    reader = new BufferedReader(new FileReader(new File(fileName)));
                    ArrayList<Apteka> list = new ArrayList<Apteka>();
                    String line = null;
                    while((line = reader.readLine()) != null) {
                           <b> list.add(new Apteka(line));</b>
                    }
                    return list;
            } catch(IOException exc) {
                    exc.printStackTrace();
                    return null;
            } finally {
                    if(reader != null) {
                            try {
                                    reader.close();
                            } catch (IOException e) {
                                    e.printStackTrace();
                            }
                    }
            }
    }

}

Wywala mi sie w wytluszczonym miejscu ;) Zrozumialem dlaczego dodalem 2ga wartosc w clasie Ale nie potrafie tego odniesc do tej klasy kontrolnej ;/

To moj [ierwszy miesiac z Java jeszcze musze sie wiele nauczyc ;/

0

Już nie trzeba, głupia pomyłka działa ;)

0

Jeśli podczas zapisywania dla jednej apteki zapisujesz dwie linie a podczas wczytywania takiego pliku każdą linie traktujesz jako oddzielną aptekę - będziesz miał po odczytaniu dwa razy więcej aptek niż przedtem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1