0

Я пишу сериализованные объекты в файл и читаю после него в android. Я получаю сообщение об ошибке «java.io.StreamCorruptedException: Wrong format: ac» при чтении второго объекта из файла. Ниже приведен код для записи объекта в файл.java.io.StreamCorruptedException: Неверный формат: ac error android

public void writeToBinary (String filename, Object obj, boolean append){ 
    file = new File ("mySchedule"); 

    try{ 
     if (!append) { out = new ObjectOutputStream (getContext().openFileOutput(filename,Context.MODE_PRIVATE)); } 
     else { out = new AppendableObjectOutputStream (getContext().openFileOutput(filename, Context.MODE_APPEND)); } 
    // Toast.makeText(getActivity().getApplicationContext(), "Starting to add to File", Toast.LENGTH_SHORT).show(); 
     out.writeObject(obj); 
     out.flush(); 
     Toast.makeText(getActivity().getApplicationContext(), "Added to File", Toast.LENGTH_SHORT).show(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
     // Toast.makeText(getActivity().getApplicationContext(), "Exception to File", Toast.LENGTH_SHORT).show(); 
    }finally{ 
     try{ 
      if (out != null) out.close(); 
      // Toast.makeText(getActivity().getApplicationContext(), "Close to File", Toast.LENGTH_SHORT).show(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

private static class AppendableObjectOutputStream extends ObjectOutputStream { 
    public AppendableObjectOutputStream(OutputStream out) throws IOException { 
     super(out); 
    } 
    @Override 
    protected void writeStreamHeader() throws IOException {} 
} 

Я вызываю метод, используя ниже строки кода, каждый раз, когда пользователь нажимает на кнопку и писать объект file.Method будет называться и объект будет сохранен как много раз, как пользователь нажимает на кнопку.

 if(MainActivity.firstTime) { 
      writeToBinary("mySchedule", scheduleBeans, false); 
      MainActivity.firstTime=false; 
     } else { 
       writeToBinary("mySchedule", scheduleBeans, true); 
     } 

Здесь scheduleBeans является объектом класса, который реализует сериализуемое. MainActivity.firstTime - общедоступная статическая логическая переменная, определенная в действии и используемая в качестве флага.

Теперь я читаю файл, используя код ниже.

ObjectInputStream ois = null; 
     try { 
      ois = new ObjectInputStream(getContext().openFileInput("mySchedule")); 
      Toast.makeText(getActivity().getApplicationContext(), "File Opened", Toast.LENGTH_SHORT).show(); 
      while (true) { 
       arrayList.add((ScheduleBeans) ois.readObject()); 
       Toast.makeText(getActivity().getApplicationContext(), "Read from File", Toast.LENGTH_SHORT).show(); 
      } 

     } catch (EOFException e) { 
      Toast.makeText(getActivity().getApplicationContext(), "Exception End of File", Toast.LENGTH_SHORT).show(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Toast.makeText(getActivity().getApplicationContext(), "Exception to Opening File", Toast.LENGTH_SHORT).show(); 
     } finally { 
      try { 
       if (ois != null) { 
        ois.close(); 
       // Toast.makeText(getActivity().getApplicationContext(), "Closing file", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       // Toast.makeText(getActivity().getApplicationContext(), "Exception in Closing file", Toast.LENGTH_SHORT).show(); 
      } 
     } 

Я получаю ошибку «java.io.StreamCorruptedException: Неправильный формат: AC» при чтении второго объекта из файла в случае, если файл имеет более чем объекты в нем.

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

Обновление-- Проблема решена. Над рассматриваемым кодом отредактирован к разрешенному рабочему коду.

+0

Возможный дубликат [StreamCorruptedException: недопустимый код типа: AC] (http://stackoverflow.com/questions/2393179/streamcorruptedexception-invalid-type-code-ac) – EJP

+0

Трудно понять, почему вы хотели бы удалить соответствующую информацию из названия. – EJP

+0

HI EJP, я прошел через сообщение, на которое вы ссылаетесь, и не может найти решение для устранения ошибки. –

ответ

0

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

Вы должны использовать его только в другом случае.

+0

Спасибо EJP, я хочу добавить объект в файл. Можете ли вы указать, как добавить объект и прочитать все объекты обратно в Android? –

+0

Вы хотите добавить * иногда. * Вы добавляете в обоих случаях. В первом случае вы не должны использовать MODE_APPEND. Вы добавили к потоку без использования добавляемого потока. – EJP

+0

Я очень благодарен. Я изменил первый MODE_APPEND на MODE_PRIVATE, и ошибка была изменена на EOFException при чтении второго объекта из файла. –

Смежные вопросы