Сериализуемый ArrayList - ошибка IOException - PullRequest
0 голосов
/ 20 января 2011

Код ниже возвращает IOException. Вот мое главное:

public class Main 
{

    public static void main(String[] args) {

 Book b1 = new Book(100, "The Big Book of Top Gear 2010", "Top Gear",
                "BBC Books", 120, "Book about cars.");

 Book b2 = new Book(200, "The Da Vinci Code", "Dan Brown", "Vatican", 450,
                "A fast paced thriller with riddles.");

 Book b3 = new Book(300, "Le Petit Nicolas", "Sempe Goscinny", "Folio", 156,
                "The adventures of petit Nicolas.");

 ArrayList<Book> biblia = new ArrayList<Book>();

 biblia.add(b1);

 biblia.add(b2);

 biblia.add(b3);

 File f = new File("objects");

        try {

            FileInputStream fis = new FileInputStream("objects");

            int u = fis.read();

            if (u != -1) {

                ObjectInputStream ois = new ObjectInputStream(fis);

                Bookstore b = (Bookstore) ois.readObject();

                ois.close();

            } else {

                Bookstore b = new Bookstore(biblia);

                FileOutputStream fos = new FileOutputStream("objects");

                ObjectOutputStream oos = new ObjectOutputStream(fos);

                oos.writeObject(b);

                oos.close();

            }

        } catch (FileNotFoundException ex1) {

            System.out.println("File not found.");

        } catch (IOException ex2) {

            System.out.println("IO Error.");

        } catch (ClassNotFoundException ex3) {

            System.out.println("Class not found.");

        }

}

Это класс Bookstore, который я использую только для хранения объектов ArrayList of Book в порядке их использования в потоках объектов.

public class Bookstore implements Serializable {


    private ArrayList<Book> myBooks = new ArrayList<Book>();

    public Bookstore(ArrayList<Book> biblia) {

        myBooks = biblia;

    } 

}

Я тоже импортировал все нужные библиотеки. Я пытаюсь сделать следующее: если файл не пустой, прочитайте оттуда ArrayList (объект книжного магазина, который содержит arraylist). Если он пуст, напишите новый. Проблема в том, что единственное, что я получаю в ответ, это «Ошибка ввода-вывода». и я не могу понять почему.

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Это неправильный способ проверить, существует ли файл.Вы пытаетесь создать поток из файла, который не существует, и FileNotFoundException выбрасывается.Вместо:

FileInputStream fis = new FileInputStream("objects");            
int u = fis.read();
if (u != -1) {

просто используйте

if(f.exists()) { ... }
1 голос
/ 20 января 2011

Это поможет вам отладить эти проблемы, если вы напечатаете трассировку стека, когда получите исключение, но я предполагаю, что Book не сериализуем.

0 голосов
/ 20 января 2011

Nightsorrow, вероятно, прав.Чтобы ответить, почему выдается сообщение «Ошибка ввода-вывода», это потому, что вы сказали программе напечатать это, если произошла ошибка ввода-вывода.В целях отладки вашего кода я удалил бы секцию

catch (IOException ex2) {

        System.out.println("IO Error.");

    }

вашего кода или закомментировал бы ее, чтобы вы могли получить трассировку стека.Затем вы можете точно определить, где и почему произошла ошибка, потому что она выдаст вам исключение, и в какую строку было сгенерировано это исключение.

...