Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация обьектов и файлы. 
V
    Опции темы
light0ff
Дата 30.1.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.1.2006
Где: Латвия, Рига

Репутация: нет
Всего: нет



Уменя есть формы. Необходимо сохранять (для последующего восстановления) положение, размеры и некоторые др. характеристики формы. Для этого я создал класс с несколькими необходимыми полями и имплементировал интерфейс java.io.Serializable.

Проблема заключается в следующем:
Сохранил одну форму. Позже сохранил другую форму. Открыл первую форму, все успешно. Открываю вторую, а у меня вылетает исключение (java.io.StreamCorruptedException). Непонятно, в чем же проблема.

Запись в файл:

Код

    fileOutputStream = new FileOutputStream("client/system/config/p3is.cfg", true);
    objectOutputStream = new ObjectOutputStream(fileOutputStream);
    FormConfigObject configObject = new FormConfigObject(...);
     objectOutputStream.writeObject(configObject);


Чтение из файла:

Код

    fileInputStream = new FileInputStream("client/system/config/p3is.cfg");
    objectInputStream = new ObjectInputStream(fileInputStream);
    configObject = (FormConfigObject) objectInputStream.readObject();


PM MAIL   Вверх
LSD
Дата 30.1.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Потоки закрываешь?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
light0ff
Дата 30.1.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.1.2006
Где: Латвия, Рига

Репутация: нет
Всего: нет



Да.

objectOutputStream.flush();
objectOutputStream.close();
PM MAIL   Вверх
LSD
Дата 30.1.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Погоди, а почему ты дописываешь в файл?
Так конечно можно делать, но тогда при создании ObjectInputStream, FileInputStream должен быть позиционирован на то место где была произведена запись. Он пишет в начало потока некую сигнатуру и когда ее не находит ругается.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
light0ff
Дата 30.1.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.1.2006
Где: Латвия, Рига

Репутация: нет
Всего: нет



Я, честно говоря, не очень понял.
Я каждый раз открываю файл на дозапись и пополняю записями.
При чтении я иду по файлу в цикле, читаю записи. На второй итерации вылетает исключение.
А как вообще можно позиционировать по файлу? А то мне также надо будет некоторые объекты заменять.
PM MAIL   Вверх
LSD
Дата 30.1.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(light0ff @ 30.1.2006, 20:23 Найти цитируемый пост)
При чтении я иду по файлу в цикле, читаю записи. На второй итерации вылетает исключение.

Не очень хороший метод, я бы даже добавил это плохой метод. Проблема в том, что FileOutputStream в начало потока пишет некую последовательносять байт, обозначающую начало потока. После того как ты записал объект 1, он записал эту сигнатуру и данные объекта. Затем ты закрыл поток, и писал новым потоком, который снова записал эту последовательность.
Поэтому когда, ты читаешь первый объект все ОК, т.к. и сигнатура на месте и данные объекта. А когда читаешь второй, то ему попадается сигнатура, хотя он ее уже не ожидает, а ожидает данные объекта. Тебе нужно закрыть ObjectInputStream и открыть его заново, продолжив читать с того же места где остановился (вот в этом то вся и сложность). В принципе это реализуемо, если будет интерестно могу рассказать как. Но мне кажется, что разумней будет изменить логику работы программы.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
light0ff
Дата 31.1.2006, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.1.2006
Где: Латвия, Рига

Репутация: нет
Всего: нет



Очередной раз большое спасибо;)
Я решил при записи считавать из файла все уже существующие объекты,
добавлять в в колекцию новый объект или редактировать старый объект,
записывать все объекты из коллекции в файл.
Проблема решена.
PM MAIL   Вверх
Jiona
Дата 24.5.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.3.2006

Репутация: нет
Всего: нет



Хм... а как читать из файла объекты? У меня есть файл .dat с несколькими объектами одного класса и мне надо реализовать цикл для чтения объектов в коллекцию... как этот цикл будет выглядеть? 
PM MAIL   Вверх
batigoal
Дата 24.5.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Jiona @  24.5.2006,  15:50 Найти цитируемый пост)
Хм... а как читать из файла объекты? У меня есть файл .dat с несколькими объектами одного класса и мне надо реализовать цикл для чтения объектов в коллекцию... как этот цикл будет выглядеть?  

Собственно, так же, как цикл записи их туда smile

А разве нельзя просто сериализовать объект коллекции целиком? 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
SnowDevil
Дата 24.5.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.5.2006

Репутация: нет
Всего: нет



Этим методом я записываю объект в файл:

Код

public void Write(){
        File f = new File(path);
        try {
            if(!f.exists()){
                f.createNewFile();
            }
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f,true));
            oos.writeObject(u);
            oos.close();
        }catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    
    }


А как мне считать потом из файла все объекты?  smile   smile  
PM MAIL   Вверх
LSD
Дата 28.5.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(SnowDevil @  24.5.2006,  19:29 Найти цитируемый пост)
А как мне считать потом из файла все объекты?

По человечески - никак, надо изголяться с потоками.

Лучше в файл писать все объекты в одной сесси записи, или писать объекты в разные файлы. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
invis87
Дата 1.10.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 1.11.2007
Где: город Королёв

Репутация: нет
Всего: нет



А возможно ли делать так:
Код

    public ArrayList<String[][]> arrlist = new ArrayList<String[][]>();
        /* идёт объявление кучи массивов
        потом
        arrlist.add(...);
        arrlist.add(...);
        ....
        */
        String[] wtf = {"12","123","124"};
        //потом я записываю эти два объекта в файл

    private void SaveButtonActionPerformed(java.awt.event.ActionEvent evt) throws IOException {
        FileOutputStream os = new FileOutputStream("table.dat",true);
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(arrlist);
        oos.writeObject(wtf);
        oos.flush();
        oos.close();
    }

Затем я удаляю объявление массива и ArrayList'a (идея в том что инициализация должна быть с файла)
и делаю так:

Код

public ArrayList<String[][]> arrlist = null;
String[] wtf = null;
//...
     try{
         FileInputStream fis = new FileInputStream("table.dat");
         ObjectInputStream ois = new ObjectInputStream(fis);
         arrlist = (ArrayList<String[][]>)ois.readObject();
         wtf = (String[])ois.readObject();
         ois.close();
     }catch (Exception e) {e.printStackTrace();}


После этого arrlist такой же какой и должен быть и готов к использованию, а вот простой массив остаётся null :( Не понимаю почему. 
И вообще можно ли так делать ? Не коряво ли ? А делать второй файл ради одного массива не хочется, да и разобраться надо.
Заранее спасибо !
PM MAIL   Вверх
batigoal
Дата 4.10.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Эксепшнов-то нет?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 5.10.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Массивы нормально сериализуются, если у тебя массив возвращается как null, значит у тебя сама ссылка на массив была null.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
nc30
Дата 22.8.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Цитата(LSD @ 30.1.2006,  20:10)
...
Тебе нужно закрыть ObjectInputStream и открыть его заново, продолжив читать с того же места где остановился (вот в этом то вся и сложность). В принципе это реализуемо, если будет интерестно могу рассказать как.
...

LSD, расскажите, если не сложно, про реализацию нескольких сессий записи/чтения для одного файла. Я начал изучать Java и столкнулся с точно такой же проблемой. БД еще не проходили, только вот до потоков ввода/вывода добрались.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.