当前位置: 首页 > 面试题库 >

java.io.StreamCorruptedException:读取多个对象时格式错误

郭乐意
2023-03-14
问题内容

我试图OneChatMessage在每次单击按钮时将对象(类)添加到文件中。然后,我尝试从文件中读取所有对象,并将其加载到ArrayList。但是我在反序列化函数StreamCorruptedException的第二次迭代中得到了一个ObjectInputStream.readObject()。我已经验证了第一次迭代可以正常工作。

我读过许多关于同一问题的其他文章:

  1. 一种建议反序列化多个Java对象是将整个数组列表而不是单个对象写入文件。但这似乎很浪费,因为每次单击按钮时我都需要写入文件,并且随着时间的推移将有数百个对象。
  2. 另一个建议StreamCorruptedException:无效类型代码:AC与ObjectOutputStream创建的不同标头有关。我不知道该用谁来解决这个问题。

关于如何解决这个问题的任何想法吗?

OneChatMessage.java:

package com.slapp.chat;

import java.io.Serializable;
import java.util.Date;

import com.slapp.localDB.Contact;

//This class defines the class for a chat message
public class OneChatMessage implements Serializable{
    private String text;
    private Date timeSent;
    private Boolean sentByMe;

    public OneChatMessage(String text, Date timeSent, Boolean sentByMe){
        this.text = text;
        this.timeSent = timeSent;
        this.sentByMe = sentByMe;
    }

    public String getText(){
        return this.text;
    }

    public Date getTimeSent(){
        return this.timeSent;
    }

    @Override
    public String toString(){
        return new StringBuffer(" Text : ")
        .append(this.text)
        .append(" TimeSent : ")
        .append(this.timeSent.toString()) // Need to use SimpleDatFormat to get the correct time zone and formatting. Leaving it for now.
        .append(" SentByMe : ")
        .append(this.sentByMe.toString()).toString();
    }
}

序列化功能:

public void addMessage(OneChatMessage msg) {
        FileOutputStream fos;
        ObjectOutputStream oos;

        File file = new File(context.getFilesDir(), "abc");
        if (!file.exists()) {
            Log.d("faizal",
                    "The file does not exist : ");
        } else {
            Log.d("faizal",
                    "The file already exists : ");
        }
        try {

            fos = context.openFileOutput("abc",
                    Context.MODE_APPEND);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(msg);
            oos.close();
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d("faizal", "file not found : ");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d("faizal", "Error closing file : ");
            e.printStackTrace();
        }
}

反序列化功能:

public ArrayList<OneChatMessage> getAllChatMessagesArrayList() {
        ArrayList<OneChatMessage> chatMessages = new ArrayList<OneChatMessage>();
        OneChatMessage oneChatMsg;
        FileInputStream fis;
        ObjectInputStream ois;

        try {

            fis = context.openFileInput("abc");
            ois = new ObjectInputStream(fis);
            //Setting an arbitrarily large number as the limit of the loop iterations
            //so that chat message are read from the file till EOF
            for (int i = 1; i < 999999999; i++) {
                try {
                    oneChatMsg = (OneChatMessage) ois.readObject();
                } catch (EOFException e) {
                    //When EOFException occurs, quit the loop
                    break;
                }

                try{
                    chatMessages.add(oneChatMsg);
                } catch(Exception e){
                    Log.d("faizal","Error adding message to Array List:" + oneChatMsg.getText());
                    e.printStackTrace();
                }


            }
            ois.close();
            fis.close();

            return chatMessages;
        } catch (FileNotFoundException e) {
            Log.d("faizal", "The file not found : ");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d("faizal", "Error closing file : ");
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            Log.d("faizal","Error reading object from file : ");
            e.printStackTrace();
        } catch (UnsupportedOperationException e) {
            Log.d("faizal", "Error adding object to array list from file : ");
            e.printStackTrace();
        }
        return null; // in case there was a caught exception

    }

Logcat:

05-27 16:56:17.576: W/System.err(25028): java.io.StreamCorruptedException: Wrong format: ac
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:701)
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:814)
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
05-27 16:56:17.576: W/System.err(25028):    at com.slapp.chat.ChatPersistenceHandler.getAllChatMessagesArrayList(ChatPersistenceHandler.java:62)
05-27 16:56:17.576: W/System.err(25028):    at com.example.slapp.ChatSessionActivity$ChatArrayAdapter.<init>(ChatSessionActivity.java:178)
05-27 16:56:17.576: W/System.err(25028):    at com.example.slapp.ChatSessionActivity.onCreate(ChatSessionActivity.java:86)
05-27 16:56:17.576: W/System.err(25028):    at android.app.Activity.performCreate(Activity.java:5372)
05-27 16:56:17.576: W/System.err(25028):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.access$700(ActivityThread.java:168)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
05-27 16:56:17.576: W/System.err(25028):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-27 16:56:17.576: W/System.err(25028):    at android.os.Looper.loop(Looper.java:137)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.main(ActivityThread.java:5493)
05-27 16:56:17.576: W/System.err(25028):    at java.lang.reflect.Method.invokeNative(Native Method)
05-27 16:56:17.576: W/System.err(25028):    at java.lang.reflect.Method.invoke(Method.java:525)
05-27 16:56:17.576: W/System.err(25028):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
05-27 16:56:17.576: W/System.err(25028):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
05-27 16:56:17.576: W/System.err(25028):    at dalvik.system.NativeStart.main(Native Method)

问题答案:

追加到ObjectOutputStream不能立即使用,因为它会创建多个标头,如
StreamCorruptedException中所述:无效类型代码:AC。

有关解决方案,请参见附加到ObjectOutputStream。



 类似资料:
  • 问题内容: 我正在尝试编写一个读取HTTP请求和响应并对其进行解析的类。由于标题是普通文本,因此似乎最容易使用 BufferedReader 和 readLine 方法读取它们。这显然不会对数据主体起作用,因为它可能是二进制的,所以我想在读取头之后切换到读取原始字节。 现在,我正在做这样的事情: 问题是 BufferedReader 正在提前读取并吞噬流中的所有二进制数据,然后才有机会使用Bins

  • 问题内容: 我正在为Android设计一个手写应用程序。 每当用户按下Enter键时,我都希望将信息()写入日志文件。 之后,我想读取存储的信息。 这是我的类的一部分,带有自定义的write方法: 这是读取方法: 当我在文件中仅保存一个对象时,它会很好地工作。当我尝试节省更多时,阅读不起作用(抛出)。 它在while循环中仅读取一个对象! 在主类中,我仅使用两种简单的方法: 定义为: 请求的更新:

  • 问题内容: 我正在尝试使用Jackson 2.0-RC3读取旧版JSON代码,但是我陷入了“嵌入式”对象的困境。 给定以下JSON: 如何将其映射到以下结构: 我试图这样做,但似乎我必须以这种方式映射整个对象。 问题答案: 要处理“嵌入式”对象,您应该使用它-等同于Hibernate的/ 。

  • 我试图创建一个实用的可见PDF签名。不可见签名可以工作,但当我添加AP(外观)对象时,Acrobat Reader中出现了一个错误,它说:“对象标签格式不正确”。 我制作的相关XObject如下所示: 我似乎找不到其中的错误,但我肯定遗漏了什么。我阅读了Adobe的整个文档以及其他一些博客,并据此编写了代码。 **更新:** 我根据mkl的评论修改了代码: 在这里你可以下载我的PDF。 更新2:我

  • 所以我不熟悉使用BufferedReader读取文件,也不熟悉Java中的ArrayList。我想知道为什么我的代码没有在arrayList中的每个DVD对象中存储正确的数据。我最初认为它的工作方式是,它从文本文件的顶部开始,读取行,然后将该信息存储在变量中。读取完一个双精度值后,它会根据以前找到的信息创建一个DVD对象。然后该文件将继续读取并存储arrayList中的剩余数据。但是,我在arra

  • 我有麻烦更新一个变量的名称为一个对象使用扫描器。我提供一个菜单给用户,用户选择他的选择(更新名称),程序要求用户输入新的名称,扫描器读取system.in并更新变量的名称。唯一的问题是程序不能读取带有空格的字符串。例如: 如果键入类似的内容,则可以执行此操作,但如果键入,则将得到,输出示例如下 所以我猜它只读取t,当扫描器扫描shipProperty值时,它读取dog而不是等待输入。我读过关于的文