Вывод / ввод файлов Java через графический интерфейс - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть три класса libraryDB, libraryItems и libraryGUI. libraryDB () - это, по сути, хэш-карта с ключами в виде книжных штрих-кодов / ISBN, а значениями являются libraryItems, которые состоят из двух строковых параметров и поэтому принимают их.

У меня есть JFileChooser, все настроенные в графическом интерфейсе для сохранения, но мои методы save () и open () вызывают проблемы. Я хочу, чтобы он был настроен так, чтобы при сохранении у каждого объекта libraryDB были свои 3 строки (по одной для штрих-кода, заголовка, автора соответственно). Я попытался загрузить их обратно, прочитав каждую отдельную строку, вот код, который я написал для этого:

//Suppose to construct a LibraryDB by reading one from a previously-saved file.
    public LibraryDB (File file) throws IOException {
        Scanner readFile = new Scanner(file);
        int barcode;
        String title;
        String author;

        while (readFile.hasNext()){
            barcode = Integer.parseInt(readFile.nextLine());
            title   = readFile.nextLine();
            author  = readFile.nextLine();
            LibraryItem authorTitleValues = new LibraryItem(title,author);
            this.libraryItems.put(barcode, authorTitleValues);
            }
    }
//Trying to save to text file, where for each object n there are 3n lines.
    public void save(File file) throws IOException {
    PrintStream writer = new PrintStream(file);
    for (Iterator<Integer> localIterator = libraryItems.keySet().iterator(); 
    localIterator.hasNext();){ 
        int barcode = ((Integer)localIterator.next()).intValue();
        writer.println(barcode);
        writer.println((libraryItems.get(Integer.valueOf(barcode))).getTitle());
        writer.println((libraryItems.get(Integer.valueOf(barcode))).getAuthor());
        }
    }

Любая помощь или понимание, которое вы можете предоставить, которые помогут мне в успешном сохранении / открытии, будут высоко цениться! Спасибо!

Больше подробностей, когда я сохраняю библиотеку DB в файл, я не могу вернуться позже и открыть файл?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2010

Файловые потоки и средство записи должны быть явно закрыты в конце записи в них - иначе они заблокируют файл.

public void save(File file) throws IOException {
    PrintStream writer = new PrintStream(file);
    try {
        for (Iterator<Integer> localIterator = libraryItems.keySet().iterator(); localIterator.hasNext();) {
            int barcode = ((Integer) localIterator.next()).intValue();
            writer.println(barcode);
            writer.println((libraryItems.get(Integer.valueOf(barcode))).getTitle());
            writer.println((libraryItems.get(Integer.valueOf(barcode))).getAuthor());
        }
        writer.flush();
    } finally {
        writer.close();
    }
}
0 голосов
/ 10 декабря 2010

Итак, я просто забыл переопределить библиотеку DB !? Grrr ... LOL Я не думаю, что компилятор будет жаловаться, потому что он уже был объявлен. Тем не менее, информация, считываемая из файла, просто уходила в забвение или что-то в этом роде, потому что не было объекта, в который ее можно было бы поместить. По крайней мере, я так думаю. Спасибо за вашу помощь. Вот мое решение:

public LibraryDB (File file) throws IOException {
//this next line was what I was missing...sigh.
    this.libraryItems = new HashMap<Integer, LibraryItem>();
        Scanner readFile = new Scanner(file);
        int barcode;
        String title;
        String author;
        while (readFile.hasNext()){
            barcode = Integer.parseInt(readFile.nextLine());
            title   = readFile.nextLine();
            author  = readFile.nextLine();
            LibraryItem authorTitleValues = new LibraryItem(title, author);
            libraryItems.put(Integer.valueOf(barcode), authorTitleValues);
            }
        readFile.close();
    }
0 голосов
/ 10 декабря 2010

Вы должны flush() и close() ваш PrintStream до завершения функции save. Я не уверен, что это проблема, поскольку ваше описание не слишком точное, но все равно сделайте это.

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