gpt4 book ai didi

java序列化和反序列化

转载 作者:搜寻专家 更新时间:2023-11-01 03:53:13 25 4
gpt4 key购买 nike

我创建了一个简单的程序,用于将 cmd 中的字符串输入序列化为 .ser 文件。部分要求是该程序必须能够附加新输入并能够读取新输入和旧输入。 .但是如果我在第二次输入后读取,我会得到 StreamCorruptedException..

这是我在 CMD 上的运行。我该如何解决这个 StreamCorruptedException 以及它为什么会发生??。代码如下。

C:\Users\MSI\Desktop\Codes For Java>java WriteFile cc.ser
Enter text and press ^Z or ^D to end.
hah
haha
hahaha
try
^Z

C:\Users\MSI\Desktop\Codes For Java>java WriteFile cc.ser
Enter text and press ^Z or ^D to end.
asd
asd
asd
asd
asd
^Z

C:\Users\MSI\Desktop\Codes For Java>java ReadFile cc.ser
1: haha
2: haha
3: hahaha
4: hahaha
The Error is :
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1375)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at ReadFile.main(ReadFile.java:23)

写入文件.java:

 import java.io.*;
public class WriteFile implements java.io.Serializable
{
public static void main(String args[])
{
try
{
File myFile = new File(args[0]);

BufferedReader br = new BufferedReader
(new InputStreamReader(System.in));
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream(myFile,true));

System.out.println("Enter text and press ^Z or ^D to end.");

String str;

while ((str = br.readLine()) != null)

{

oos.writeObject(str);
}


br.close();
oos.close();
}

catch (IOException i)
{
i.printStackTrace();
}
}}

读取文件.java:

import java.io.*;
public class ReadFile
{
public static void main(String args[])
{

try
{
int ctr = 0;

File myFile = new File(args[0]);

ObjectInputStream OIS = new ObjectInputStream
(new FileInputStream( myFile ));
String str;



while ((str = (String)OIS.readObject()) != null)

{

System.out.println(++ctr + ": " + str);

}

OIS.close();
}

catch (EOFException ex)
{
System.out.println("\nEnd of File Reached ");
}



catch (ClassNotFoundException c)
{
System.out.println("The Error is : ");
c.printStackTrace();
}catch (IOException i)
{
System.out.println("The Error is : ");
i.printStackTrace();
}
}}

最佳答案

每当您尝试为现有输入流创建新的 OutputStream 对象/甚至在写入内容之前尝试读取时,都会发生此异常,在这种情况下,从对象流读取的控制信息违反了内部一致性检查。

在套接字的生命周期内使用单个 OOS 和 OIS,并且不要在套接字上使用任何其他流。

您可能还想在同一程序中使用线程实现相同的功能。

如果您想忘记您所写的内容,请使用 ObjectOutputStream.reset()。

关于java序列化和反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com