Добавляемый двоичный файл - PullRequest
1 голос
/ 17 июня 2020

Я работаю над добавлением объектов в двоичный файл. Мой файл:

File f=new File("person.dat");

Я получаю сообщение об ошибке (java .io.StreamCorruptedException: недопустимый заголовок потока: 79737200) при попытке открыть двоичный файл. Насколько я могу судить, программа записывает данные нормально, но как только я пытаюсь прочитать их, я получаю указанную выше ошибку. Любая помощь приветствуется!

Мой код для записи:

AppendObjectOutputStream out = null;

try {
    out = new AppendObjectOutputStream(new FileOutputStream(f, true));
    out.writeObject(new Student(name, age));
    out.flush();

     } 
catch (Exception ex) {
    ex.printStackTrace();
     } 
 finally {
    out.close();
     }

Мой класс для создания добавляемого:

public class AppendObjectOutputStream extends ObjectOutputStream {

    public AppendObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    @Override
    protected void writeStreamHeader() throws IOException {
        reset();
    }
 }

Мой частичный код для чтения и добавления объектов в ArrayList:

Course course = new Course();
Student st = null;
ObjectInputStream in = null;
try {
    in = new ObjectInputStream(new FileInputStream("person.dat"));

    try 
      {
        while (true) 
         {
            st = (Student) in.readObject();
            course.addAccount(st); //adds student object to an ArrayList in 
                                   //class Course
          }
      } 
    catch (EOFException ex) {
    }
  } 
  catch (Exception ex) {
    ex.printStackTrace();
  } finally {
    in.close();
  }

ОБНОВЛЕНИЕ: текущий код для чтения, но ничего не выводит на экран:

try(ObjectInputStream ois = new ObjectInputStream(
                        new BufferedInputStream(Files.newInputStream(f))))
 {
            while (ois.available() > 0) 
            {

                    st = (Student) ois.readObject();
                    studentlist.addAccount(st);
                    System.out.println(st.getStudentNumber());
                }

            }

 catch (Exception ex) 
                {
                    ex.printStackTrace();
                }

Вот как я пишу в файл:

Path f = Paths.get("person.dat");

   try (ObjectOutputStream oos = new ObjectOutputStream(
           new BufferedOutputStream(Files.newOutputStream(f, StandardOpenOption.APPEND))))
   {
       oos.writeObject(new Student(name,age));    
   }
   catch(Exception ex)
   {
       ex.printStackTrace();
   }

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вместо того, чтобы пытаться исправить ваши служебные классы, я предлагаю использовать стандартные классы API файлов NIO.2.

Попробуйте что-нибудь вроде (непроверено):

    Path personDataFilePath = Paths.get("person.dat");
    // or Java 11:
    // Path personDataFilePath = Path.of("person.dat");
    try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(Files.newOutputStream(personDataFilePath, StandardOpenOption.APPEND)))){
        oos.writeObject(new Student(name,age));
    } catch (IOException ex) {
        // do some error handling here
    }

и чтобы прочитать файл, что-то вроде (непроверено):

    List<Student> students = new ArrayList<>();
    try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(Files.newInputStream(personDataFilePath)))){
        while (ois.available() > 0){
            students.add((Student) ois.readObject());
        }
    } catch (IOException ex) {
        // do some error handling here
    }
0 голосов
/ 19 июня 2020

Я изменил код, чтобы сделать файл «добавляемым». Я записываю в файл единственный объект arraylist (Arraylist содержит список ученических объектов). Когда я хочу добавить ученика, я читаю объект (Arraylist) из файла, добавляю своего нового ученика в Arraylist и записываю Arraylist обратно в файл. Теперь он работает, и мой файл не имеет формата добавления.

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