• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wczytywanie obiektów z pliku do tablicy, program wczytuje tylko pierwszy obiekt

Object Storage Arubacloud
0 głosów
738 wizyt
pytanie zadane 28 lipca 2017 w Java przez MichałB Nowicjusz (180 p.)

 

 

Witam

W ramach treningu i nauki javy pisałem programik który zapisuje obiekty klasy Book do pliku Object.obj. Zapisywanie poszło bez problemu, przy wczytywaniu pojawił się problem. Chciałem wczytać obiekty z pliku do tablicy klasy Book i tutaj program wczytuje mi tylko pierwszy obiekt kilka razy(w tym przypadku 3, petal for w metodzie PrintBook ograniczona do 3).

Tutaj pojawia się moje pytanie, co mam zrobić aby wczytać kolejny obiekt z pliku i jakim argumentem zamykać pętle, aby kończyła działanie gdy wczyta wszystkie obiekty z pliku, a nie jak to ma w obecnym przykładzie pętla kończy działanie gdy i>= 3.

 


public class Library {

	private static final int MAX_BOOKS= 100;
	private int booksNumber= 1;
	private Book[] books;
	private FileManager fm;
	
	public Library(){
		books= new Book[MAX_BOOKS];
		fm= new FileManager();
	}
	public void addBook(Book book){
		if(booksNumber<MAX_BOOKS){
			for(int i=0; i<books.length; i++){
				books[i]= book;
				booksNumber++;
				fm.writeObjectToFile(book);
			}
		}else{
			System.out.println("Lack of space");
		}
	}
	public void printBook() {
			for(int i=0; i<3; i++){
				books[i]= fm.readObjectFromFile();
				System.out.println(i+" "+books[i]);
			}
		}


}

public class FileManager {

	private static final String FILE_NAME= "Object.obj";
	private File file= new File(FILE_NAME);
	
	public void writeObjectToFile(Book book){
		boolean exist= file.exists();
		if(exist== true){
			try (FileOutputStream fos= new FileOutputStream(FILE_NAME, true);
					ObjectOutputStream oos= new ObjectOutputStream(fos);) {
				oos.writeObject(book);
				oos.writeBytes("\n");
				System.out.println("Object wrote");
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}else{
			try {
				file.createNewFile();
				System.out.println("File Created");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public Book readObjectFromFile(){
		Book book= null;
		
		try(FileInputStream fis= new FileInputStream(FILE_NAME);
				ObjectInputStream ois= new ObjectInputStream(fis);) {
			book= (Book) ois.readObject();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return book;
	}
}
komentarz 31 lipca 2017 przez Mar Cin Dyskutant (8,900 p.)
Pętla for-each niekoniecznie tutaj pasuje ..

2 odpowiedzi

0 głosów
odpowiedź 29 lipca 2017 przez Rubeus024 Obywatel (1,680 p.)

Cześć,

Nie jestem pewien, ale problem widzę w tej częsci: 

for(int i=0; i<books.length; i++){
                books[i]= book;
                booksNumber++;
                fm.writeObjectToFile(book);

Wynika z niego, że gdy chcemy dodać jedną książke, nadpisujemy wszystkie pozostałe w tablicy.

komentarz 29 lipca 2017 przez MichałB Nowicjusz (180 p.)
public void writeObjectToFile(Book book){
        boolean exist= file.exists();
        if(exist== true){
            try (FileOutputStream fos= new FileOutputStream(FILE_NAME, true);

Słowo true na końcu FileOutputStream fos= new FileOutputStream(FILE_NAME, true); oznacza, że obiektu będą dopisywane do pliku, więc to nie. Główny problem jest z wczytaniem obiektów z pliku.

Tutaj jest metoda wczytująca elementy, niestety wyskakuje błąd java.io.StreamCorruptedException. Nie wiem jak ominąć ten wyjątek.


public Book readObjectFromFile(){
        Book book= null;
        
        try(FileInputStream fis= new FileInputStream(FILE_NAME_OBJECT_DATA);
                ObjectInputStream ois= new ObjectInputStream(fis);) {
        while((book= (Book) ois.readObject())!= null){
            System.out.println(book);
        }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return book;
    }

 

0 głosów
odpowiedź 31 lipca 2017 przez Mar Cin Dyskutant (8,900 p.)

Pseudo kod, napisany na kolanie: 

File file = new File(path.txt);
Scanner in = new Scanner(file);

while(in.hasNextLine){
//logika
}

 

Podobne pytania

+1 głos
1 odpowiedź 829 wizyt
pytanie zadane 23 października 2021 w Java przez DzikieHarce Użytkownik (690 p.)
0 głosów
2 odpowiedzi 321 wizyt
0 głosów
1 odpowiedź 560 wizyt
pytanie zadane 7 marca 2017 w C i C++ przez niezalogowany

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...