Десериализация в Java не работает согласованно между несколькими методами - PullRequest
0 голосов
/ 11 сентября 2018

Я получаю сообщение об ошибке при создании FileInputStream в deletebook() метод. Но то же самое создание объекта работает в searchBook() метод. Кто-нибудь знает, почему код дает разные результаты, когда отличаются только параметры, передаваемые методам?

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TestMain {
    public static final String FILENAME = "cool_file.txt";
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // TODO Auto-generated method stub
        FileOutputStream fos = null;
        fos = new FileOutputStream(FILENAME);
        System.out.println("Welcome to the Application");
        ObjectOutputStream oos1;
        int sel = 0;
        TestMain t = new TestMain();
        do {
            System.out.println("1) addSubject");
            System.out.println("2) addBook");
            System.out.println("3) deleteSubject");
            System.out.println("4) deleteBook");
            System.out.println("5) searchBook");
            System.out.println("6) searchSubject");
            System.out.println("7) Exit");
            System.out.println("#############");
            System.out.println("Insert a selection");
            Scanner s = new Scanner(System.in);
            sel = s.nextInt();

            switch (sel) {
            case 1:
                t.addSubject();
                break;
            case 2:
                t.addBook(fos);
                break;
            case 3:
                t.deleteSubject();
                break;
            case 4:
                t.deleteBook(fos);
                break;
            case 5:
                t.searchBook();
                break;
            case 6:
                t.searchSubject();
                break;
            case 7:
                t.exitService();
                break;
            default:
                System.out.println("Invalid Selection");
            }

        } while (sel != 7);

    }

    public void addSubject() {
        System.out.println("In addSubject"+"\n");
        }

    public void addBook(FileOutputStream fos) throws IOException {
        System.out.println("In addBook"+"\n");
        long bookId;
        String title;
        double price;
        Integer volume;
        LocalDate publishDate;
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        System.out.println("Enter Book ID");
        Book b=new Book();
        Scanner s=new Scanner(System.in);
        bookId=s.nextLong();
        System.out.println("Enter the Title of the Book");
        title=s.next();
        System.out.println("Enter the price of the Book");
        price=s.nextDouble();
        System.out.println("Enter the Volume of the Book");
        volume=s.nextInt();
        System.out.println("Enter the publishDate of the Book");
        String dateStr_1=s.next();
           DateTimeFormatter formatter_1=DateTimeFormatter.ofPattern("dd-MM-yyyy");
            publishDate= LocalDate.parse(dateStr_1,formatter_1);
            b.setBookId(bookId);
            b.setTitle(title);
            b.setPrice(price);
            b.setVolume(volume);
            b.setPublishDate(publishDate);

            oos.writeObject(b);
            //fos.close();
            //oos.close();

    }


    public void deleteSubject() {
        System.out.println("In deleteSubject"+"\n");
    }

    public void deleteBook(FileOutputStream fos) throws IOException, ClassNotFoundException {
        System.out.println("In deleteBook"+"\n");
        System.out.println("Enter the Book Id to be deleted");
        Scanner s=new Scanner(System.in);
        int bookId=s.nextInt();
        ArrayList<Book> results = new ArrayList<Book>();

        FileInputStream fis = null;
        System.out.println(fis);
        try {
            fis = new FileInputStream(FILENAME);
            System.out.println(fis);
            while (true) {
                ObjectInputStream ois = new ObjectInputStream(fis);
                results.add((Book) ois.readObject());
            }
        } catch (EOFException ignored) {
            ignored.printStackTrace();
            // as expected
        } finally {
            if (fis != null)
                fis.close();
            System.out.println("Finally");
        }
        System.out.println("results = " + results);
        for(Book b:results)
        {
        if(b.getBookId()==bookId)   
        {
            results.remove(b);
        }
        }

        File file = new File(FILENAME);

        if(file.exists())
        {
            file.delete();
            System.out.println("File Exists");
            if(file.exists())
                {
                System.out.println("File Exists after deletion");
            }
        }
            if(file.delete())
        {
            System.out.println("File deleted successfully");
        }
        else
        {
            System.out.println("Failed to delete the file");
        }

        /*ObjectOutputStream oos = new ObjectOutputStream(fos);
        for(Book newb:results)
        oos.writeObject(newb);*/


    }
    public void searchBook() throws ClassNotFoundException, IOException {
        System.out.println("In searchBook"+"\n");
         ArrayList<Book> results = new ArrayList<Book>();

            FileInputStream fis = null;
            try {
                fis = new FileInputStream(FILENAME);
                while (true) {
                    ObjectInputStream ois = new ObjectInputStream(fis);
                    results.add((Book) ois.readObject());
                }
            } catch (EOFException ignored) {
                // as expected
            } finally {
                if (fis != null)
                    fis.close();
            }
            System.out.println("results = " + results);

    }
    public void searchSubject() {
        System.out.println("In searchSubject"+"\n");

    }
    public void exitService() {
        System.out.println("Thank You for using the service..You rare now Exitinng the service");

    }
}

Это консоль:

Добро пожаловать в приложение 1) addSubject 2) addBook 3) deleteSubject 4) deleteBook 5) searchBook 6) searchSubject 7) Выход

####### Вставить выделение 2 в addBook

Введите ID книги 1 Введите название книги ufihv Введите цену Книга 1 Введите объем книги 1 Введите дату публикации Книга 01-01-2001 1) addSubject 2) addBook 3) deleteSubject 4) deleteBook 5) searchBook 6) searchSubject 7) Выход

####### Вставить выделение 2 в addBook

Введите ID книги 2 Введите название книги 2 Введите цену Книга 2 Введите объем книги 2 Введите дату публикации Книга 02-02-2002 1) addSubject 2) addBook 3) deleteSubject 4) deleteBook 5) searchBook 6) searchSubject 7) Выход

####### Вставить выделение 4 В deleteBook

Введите идентификатор книги, которую нужно удалить 1 ноль java.io.FileInputStream@7106e68e java.io.EOFException Окончательные результаты = [Book @ 1a6c5a9e, Book @ 37bba400] Файл существует Файл существует после удаления Не удалось удалить файл 1) addSubject 2) addBook 3) deleteSubject 4) deleteBook 5) searchBook 6) searchSubject 7) Выход

####### Вставить выделение в java.io.ObjectInputStream $ PeekInputStream.readFully (Неизвестный источник)

at java.io.ObjectInputStream $ BlockDataInputStream.readShort (Неизвестно Источник) в java.io.ObjectInputStream.readStreamHeader (Неизвестный источник) в java.io.ObjectInputStream. (Неизвестный источник) в TestMain.deleteBook (TestMain.java:124) в TestMain.main (TestMain.java:49)

1 Ответ

0 голосов
/ 11 сентября 2018

Я не совсем уверен, почему вы удаляете файл, который имеет сериализуемое состояние ваших объектов. Итак, когда вы удаляете файл, который имеет сериализуемое состояние вашего объекта. Вы потеряете все, даже файла не будет. И, если вы попытаетесь получить доступ к тому же файлу другим способом, вы получите исключение.

Кроме того, когда вы удаляете конкретный объект, вы не сохраняете последнее обновленное состояние вашего объекта в файл (вы не сериализовали последнее состояние объекта), вместо этого вы непосредственно удаляете файл. Тогда какой смысл удалять объекты из десериализованного объекта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...