java.io.StreamCorruptedException:读取多个对象时格式错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java.io.StreamCorruptedException:读取多个对象时格式错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6104字,纯文字阅读大概需要9分钟。
内容图文
![java.io.StreamCorruptedException:读取多个对象时格式错误](/upload/InfoBanner/zyjiaocheng/660/376185f53c45403483b96af69e5e6095.jpg)
这个问题已经在这里有了答案: > StreamCorruptedException: invalid type code: AC 1个
我试图在每次单击按钮时将一个对象(OneChatMessage类的对象)添加到文件中.然后,我尝试从文件中读取所有对象,并将其加载到ArrayList中.但是我在反序列化函数的ObjectInputStream.readObject()的第二次迭代中得到了StreamCorruptedException.我已经验证了第一次迭代可以正常工作.
我已经读过许多关于同一问题的其他文章:
>一个建议(Deserialize multiple Java Objects)是将整个数组列表而不是单个对象写入文件.但这似乎很浪费,因为每次单击按钮时我都需要写入文件,并且随着时间的推移将有数百个对象.
>另一个建议(StreamCorruptedException: invalid type code: 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: invalid type code: AC中所述.
有关解决方案,请参见Appending to an ObjectOutputStream.
内容总结
以上是互联网集市为您收集整理的java.io.StreamCorruptedException:读取多个对象时格式错误全部内容,希望文章能够帮你解决java.io.StreamCorruptedException:读取多个对象时格式错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。