java.io.StreamCorruptedException:读取超过 1 个对象时格式错误[重复]

2023-12-12

我正在尝试添加一个对象(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.

See 附加到 ObjectOutputStream寻求解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.io.StreamCorruptedException:读取超过 1 个对象时格式错误[重复] 的相关文章

  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐