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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RandomAccessFile и ошибка записи объекта в файл, запись в файл  
V
    Опции темы
Leledinn
Дата 28.11.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.

Есть непонятная проблема, которая ставит меня в тупик. 

Я запускаю тест-класс пакета JUnit в среде Netbeans в режиме Run и получаю IOException при записи второго элемента массива ArrayList<Element> (соответственно, остальные элементы массива тоже не записываются). В тоже время запуск этого же теста в режиме Debug по шагам и просто прогоном нормально проходит и все объекты массива записываются в файл. Также нормально проходит запись, если объект единственный - в любом случае: в debug или run.

Понять не могу ,то ли это Нетбинс тупит, то ли я. Скорее всего - я, поэтому прошу помощи.
 
Код:
Код

//

public class DiskReaderWriter {

//...

private RandomAccessFile file; 
private Cursors cursors;
//....
private FileImageOutputStream fios;

private void writeToCursor(Element element, CursorObject cursor) throws CacheException {        
        Long pointer = cursor.getAddress(); //получаем стартовый адрес для записи
        try {
            fios = new FileImageOutputStream(file); //открываем поток записи
            fios.seek(pointer); //устанавливаем курсор
            fios.write(Element.getBytes(element)); //сериализуем элемент для записи, формируем массив байтов и пишем в поток[color=red][font=tahoma]<<<<< Ошибка[/font][/color]  
            fios.flush(); 
        } catch (IOException ex) {
            throw new DiskCacheException(ex, CacheException.E_SOURCE_DISK_IOERROR);       [color=red][font=tahoma]<<<<< Ошибка[/font][/color]
        } finally {
        }
    }

private CursorObject validateWrite(Element element) throws CursorCacheException { //метод для получения курсора (адрес, длина) - 
        CursorObject cursor = null;

        try {
            cursor = cursors.setCursor(element.getObjectKey(), ((Long) element.getSerializedSize()).intValue());
        } catch (CursorCacheException CCE) {
            throw CCE;
        }

        return cursor;
    }

public boolean putElement(Element element) throws CacheException { //public метод записи элемента в файл
        CursorObject cursor;
        try {
            cursor = validateWrite(element); //получаем курсор (за это отвечает класс, работоспособность которого проверена другими тестами)
            if (cursor != null) {
                this.writeToCursor(element, cursor); // пишем на диск элемент в указанное курсором место в файле
                return true;
            }
        } catch (CursorCacheException CCE) {
            return false;
        }
        return false;
    }

public boolean createTMPFile(String fileName) {
        try {
            file = new RandomAccessFile(fileName, "rw");
            file.seek(0);
            //current = file.getFilePointer();
        } catch (FileNotFoundException fnfex) {
            logger.severe("File not found: " + fnfex);
            return false;
        } catch (IOException ioex) {
            logger.log(Level.SEVERE, null, ioex);
        }
        this.fileName = fileName;
        return true;
    }

}


Код

[color=red]// код, где происходит формирование объектов и попытка записи в файл (часть метода, вызываемого JUnit TestCase): [/color]

private DiskReaderWriter drw = null; //объект класса для работы с диском

{
// инициализация объектов 
}

ArrayList<Element> elements = new ArrayList<Element>();

        for (int i = 0; i < 5; i++) {  //создаем массив объектов для записи
            elements.add(new Element(
                    new String("KEY" + i),
                    new String("VALUE" + i),
                    System.currentTimeMillis()));
        }

        if (drw.createTMPFile("TMP" + System.currentTimeMillis() + ".TMP")) { //открываем файл для записи 
            boolean success = true;
            for (int j = 0; j < elements.size(); j++) {
                success = success && drw.putElement(elements.get(j)); //пытаемся писать элементы массива

                //Element readElement = drw.getElement("KEY" + j);
                logger.info("Object written: " + elements.get(j).toString());
                //logger.info("Object read: " + readElement.toString());
            }
            return success && drw/*.deleteTMPFile();/*/.closeTMPFile();
        } else {
            return false;
        }


CursorObject представляет собой объект, в котором хранится текущий адрес записываемого объекта и длина  сериализованного объекта в байтах.  Адрес и длина используется для установки курсора для РандомАксесс файла.
Cursors - это хранилище объектов типа CursorObject. Карта размещения объектов в РандомАксесс файле. Используется для хранения  структуры файла ,в который ведется запись.
Element - это класс, который представляет собой описание объекта, записываемого на диск. Конкретный экземпляр класса сериализуется и побайтно пересылается в буфер записи. 

Данные, поступающие на запись проверены другими тестами и 100% правильные. 

Таки, в чем проблема? Во мне или в Netbeans и JUnit? Сижу полдня уже и понять не могу, где ошибка. Глаз замылен. Помогите, пожалуйста.

Добавлено @ 15:28
Да, забыл сказать: объекты, записываемые в файл имеют произвольную длину.  Т.е. Element   является оберткой для объектов любого типа. Поэтому используется такой дикий механизм записи в файл. 

Это сообщение отредактировал(а) Leledinn - 28.11.2008, 15:29
PM MAIL   Вверх
ivg
Дата 29.11.2008, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Код

    private void writeToCursor(Element element, CursorObject cursor) throws CacheException {        
        Long pointer = cursor.getAddress(); //получаем стартовый адрес для записи
        try {
            this.file.seek(pointer); //устанавливаем курсор
            this.file.write(Element.getBytes(element));
        } catch (IOException ex) {
            throw new DiskCacheException(ex, CacheException.E_SOURCE_DISK_IOERROR);
        }
    }
...
    public boolean createTMPFile(String fileName) {
        try {
            this.file = new RandomAccessFile(fileName, "rwd");
        } catch (FileNotFoundException fnfex) {
            logger.severe("File not found: " + fnfex);
            return false;
        } catch (IOException ioex) {
            logger.log(Level.SEVERE, null, ioex);
            return false;
        }
        this.fileName = fileName;
        return true;
    }

PM MAIL   Вверх
Leledinn
Дата 11.12.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема решена.

Спасибо ))
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.0389 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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