Как записать сериализуемые объекты в файлы XML без перезаписи файла?SAXParseException - PullRequest
0 голосов
/ 14 сентября 2018

Как видно из заголовка, я хочу записать объекты в файл без перезаписи одного и того же файла.Проблема в том, что когда я пытаюсь записать объект в файл, я получаю следующее сообщение:

"org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Преждевременное завершение файла. Продолжение... "

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

package application.library.crud.kvlth;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class Create {
    private static XMLEncoder output;
    private static XMLDecoder inpt;
    public static void main(String[] args) throws IOException {
        openFile();
        addRecords();
        closeFile();
    }

    public static void openFile() {
            try {
                output = new XMLEncoder(
                        new BufferedOutputStream(
                                new FileOutputStream("library.xml")));

            } catch (IOException ioException) {
                System.err.println("Error opening file. Terminating.");
                System.exit(1);
            }

    }

    public static void addRecords() throws IOException {
        inpt = new XMLDecoder(
                new BufferedInputStream(
                        new FileInputStream("library.xml")));

        ArrayList<Book> books;

        Scanner input = new Scanner(System.in);

        System.out.printf("%s%n%s%n? ",
                "Enter ISBN number, Author's name, Book's Title.",
                "Enter end-of-file indicator to end input.");

        while (input.hasNext()) {

            try {
                Book record = new Book(input.nextLine(),
                        input.nextLine(), input.nextLine());

                books = (ArrayList<Book>) inpt.readObject(); /*here 
                at my IDE (Intellij) it shows me the following 
                message: "Unchecked cast: 'java.lang.Object' to 
               'java.util.ArrayList'"*/
                inpt.close();
                books.add(record);
                output.writeObject(books);

            } catch (NullPointerException e){
                e.getStackTrace();

            } catch (ArrayIndexOutOfBoundsException arrayExc){

            }
            System.out.println("? ");
        }
    }

    public static void closeFile() {
        if (output != null)
            output.close();
    }
}

Это то, что он показывает мне,Он продолжает работать, но никогда не записывает в файл.

1 Ответ

0 голосов
/ 14 сентября 2018

Нет пути к write objects to the file without overwrite the same file.Если вы хотите прочитать файл, вставьте некоторые элементы посередине, затем выведите оставшуюся часть файла, которую вам либо нужно прочитать в памяти, затем снова запишите все это, либо запишите во временный файл, где вы выполняете вставку, изатем скопируйте временный файл поверх оригинала.

Итак, в вашем случае замените выходной файл на временный, а затем скопируйте его поверх оригинала, когда закончите выводить его.

Пример процесса потоковой передачи: Например, если вы вводите input.xml:

<books>
    <Book>Genesis</Book>
    <Bool>Leviticus</Book>
</books>

, вы будете читать элементы до тех пор, пока не достигнете точки, в которую хотите добавить новую книгу, записав в выходной файл

read
    <books>

write
    <books>

read
        <Book>Genesis</Book>

write
        <Book>Genesis</Book>

, затем добавьте книгу, которую хотите добавить

write
        <Book>Exodus</Book>

, затем продолжите с остальными

read
        <Book>Leviticus</Book>

write
        <Book>Leviticus</Book>

read
        </books>

write
        </books>

В результате output.xml:

<books>
    <Book>Genesis</Book>
    <Bool>Exodus</Book>
    <Bool>Leviticus</Book>
</books>

Этогораздо проще работать с SAX, чем с чем-то, что объединяет все книги в массиве.Вам, вероятно, не нужно делать это, если вы не обрабатываете большие объемы данных.

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