Запись в файл произвольного доступа с использованием методов суперкласса и расширенного класса - PullRequest
1 голос
/ 24 ноября 2011

У меня есть класс Book и класс Library Book, который расширяет Book.Я храню информацию в файле произвольного доступа.У меня есть метод writeToFile, который записывает объекты Book в файл произвольного доступа.Метод writeToFile моего класса LibraryBook вызывает super.writeToFile, а затем я хочу, чтобы он записал в файл поля, относящиеся к LibraryBook.Как правильно это сделать?см. код:

метод из класса книги:

public void writeToFile(String fileName, long location) throws Exception {
    try {
        RandomAccessFile invFile = new RandomAccessFile(fileName, "rw");
        // seek to correct record in file
        invFile.seek(location);
        // now write out the record
        // write out the data in fixed length fields
        // String fields must be truncated if too large
        // or padded with blanks if too small
                       //write out all Book variable to file
        invFile.writeLong(ISBN);
        //etc.....          

    } catch (FileNotFoundException notFound) {
        throw new FileNotFoundException();
    } catch (IOException io) {
        throw io;
    }
}

метод из класса LibraryBook, который расширяет книгу:

    public void writeToFile(String fileName, long location) throws Exception {
    try {
        super.writeToFile(fileName, location);
        RandomAccessFile invFile = new RandomAccessFile(fileName, "rw");

        // seek to correct record in file
        invFile.seek(location);
        // now write out the record
        // write out the data in fixed length fields
        // String fields must be truncated if too large
        // or padded with blanks if too small
                       //write library book variables to file
        invFile.writeLong(branchID);
                        //etc....

                    invFile.close();
    } catch (FileNotFoundException notFound) {
        throw new FileNotFoundException();
    } catch (IOException io) {
        throw io;
    }
}

как я могу его кодироватьМетод LibraryBook writeToFile может вызывать метод суперкласса и сохранять библиотечную книгу в файл?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Сделайте ваш метод writeToFile() окончательным.

Затем добавьте защищенный метод writeExtraData(), который ничего не делает в случае с книгой, но переопределяет запись дополнительных полей в классе LibraryBook.Вызывайте это с середины writeToFile() метода в Book.Очевидно, вам потребуется реализовать симметричный набор методов чтения.

Еще лучше, прекратите изобретать велосипед и писать неприятный шаблонный код и просто используйте встроенные классы <a href="http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html" rel="nofollow">ObjectOutputStream</a> и <a href="http://docs.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html" rel="nofollow">ObjectInputStream</a>, которые предоставляет языкделать такие вещи.Тогда вы можете просто пойти readObject().

0 голосов
/ 24 ноября 2011

То, что вы делаете, - это, по сути, хранение записей в файле; уже есть много механизмов для хранения структурированных данных в файлах. Если вы заинтересованы в том, чтобы делать это для обучения, то во что бы то ни стало продолжайте - но если вы просто хотите, чтобы эта проблема была решена, подумайте о том, чтобы использовать что-то вроде SQLite3 , чтобы предоставить вам хранилище.

Если вы хотите продолжить этот подход, вам нужно определить, какой размер будет использовать каждый из ваших методов, выделить часть файла для каждого из методов для обновления и убедиться, что каждый из них точно знает, где в файл - это его местоположение.

Если бы это была просто программа на C, я бы посоветовал подсчитать поля, за которые отвечает каждый метод, #define этих размеров и #define смещений, добавляемых к location для каждого.

Но это не очень "Java" - вы должны иметь возможность изменять родителей, детей или добавлять новые классы полностью, не зная подробностей о других классах.

Таким образом, вы, возможно, захотите назначить один класс, отвечающий за запись структурированных данных в файлы, и запросить у каждого из участвующих классов свои данные. Пусть каждый класс возвратит массив byte s, который они хотят записать, и пусть один мастер-класс выполняет all запись.

Объединив все свои файловые операции ввода-вывода в один класс, вы сможете в дальнейшем легче переходить на другой формат хранения, поддерживать совместимость для двух или трех предыдущих версий вашей программы или предоставлять несколько баз данных для разных нужд при развертывании.

...