• 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

0 głosów
834 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ź 1,077 wizyt
pytanie zadane 23 października 2021 w Java przez DzikieHarce Użytkownik (690 p.)
0 głosów
2 odpowiedzi 409 wizyt
0 głosów
1 odpowiedź 600 wizyt
pytanie zadane 7 marca 2017 w C i C++ przez niezalogowany

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...