gpt4 book ai didi

java - 无法从 InputStream 读取多个可外部化对象

转载 作者:行者123 更新时间:2023-12-02 05:50:52 25 4
gpt4 key购买 nike

我在从 InputStream(即从文件)读取多个对象时遇到问题。我收到异常:

java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.socket.Client.readFromFile(Client.java:63)
at com.socket.Client.main(Client.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我只成功读/写了一个对象,没问题。我可以写很多对象,也没关系。但我无法从文件中读取多个对象。为什么会这样?

编辑:

注意!看来我遇到了在Externalazible类中实现List的问题。如何正确实现?

我的“主要”代码:

public class Client {


public static void main(String[] args) {

if (args[0] == null || args[1] == null) {
System.out.println("No arguments entered!");
System.exit(0);
}

try (Socket clientSocket = new Socket("localhost", 3000);
OutputStream outbound = clientSocket.getOutputStream();
BufferedReader inbound = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));) {

outbound.write((args[0] + "\n").getBytes());
outbound.write("End\n".getBytes());

List<StockQuote> stockQuotes = new ArrayList<>();
String quote;
while (true) {
quote = inbound.readLine();

if (quote != null && quote.equals("End"))
break;

stockQuotes.add(new StockQuote(args[0], new Double(quote)));
}

writeInFile(args[1], stockQuotes);
stockQuotes.clear();

stockQuotes = readFromFile(args[1]);
if (stockQuotes != null)
for (StockQuote stockQuote : stockQuotes)
System.out.println("The " + stockQuote.getSymbol() + " price is " + stockQuote.getPrice());

} catch (UnknownHostException e) {
System.out.println("No such host available!");
} catch (IOException e) {
System.out.println("Server not reachable or down!!");
}
}

private static List<StockQuote> readFromFile(String filename) {

File file = new File(filename);

try (ObjectInputStream readFromFile = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));) {
return (List<StockQuote>) readFromFile.readObject();
} catch (FileNotFoundException e) {
System.out.println("'" + filename + "' is not found in " + file.getPath());
} catch (IOException e) {
e.printStackTrace();
System.out.println("Something gone wrong in the process of reading from '" + file + "'");
} catch (ClassNotFoundException e) {
System.out.println("Cast to class is wrong!");
}

return null;
}

private static void writeInFile(String filename, List<StockQuote> stockQuotes) {

File file = new File(filename);

try (ObjectOutputStream writeInFile = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file, true)));) {
writeInFile.writeObject(stockQuotes);
} catch (FileNotFoundException e) {
System.out.println("'" + filename + "' is not found in " + file.getPath());
} catch (IOException e) {
System.out.println("Something gone wrong in the process of writing to '" + file + "'");
}
}

}

可外部化的“StockQuote”类:

public class StockQuote implements Externalizable {

private String symbol;
private double price;
private List<StockQuote> stockQuoteList;

public StockQuote() {
}

public StockQuote(String symbol, double price) {
this.symbol = symbol;
this.price = price;
}

public String getSymbol() {
return symbol;
}

public void setSymbol(String symbol) {
this.symbol = symbol;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(stockQuoteList);
}

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
stockQuoteList = (List<StockQuote>) in.readObject();
}

}

结果:

结果,我收到类似“空价格为 0.0”的信息。它说我序列化了列表,但其中的对象没有序列化,为什么?

注意!

您能否再给我一个提示,如何在外部化类中更好地编写字符串、列表等作为 out.writeObject 或者有更好的方法来做到这一点?

最佳答案

您的读取和写入不对称。

要写两个股票报价,您

  • 打开一个新的ObjectOutputStream
  • 编写股票报价
  • 关闭ObjectOutputStream
  • 打开一个新的ObjectOutputStream
  • 编写股票报价
  • 关闭ObjectOutputStream

要阅读这两个股票行情,您

  • 打开一个ObjectInputStream
  • 阅读股票报价
  • 阅读股票报价
  • 关闭ObjectInputStream

每次打开新的 ObjectOutputStream 时,序列化 header 都会写入底层流。

我的建议:将所有 StockQuotes 存储到一个列表中,完成后将此列表写入 ObjectOutputStream。在接收端,读取列表。

关于java - 无法从 InputStream 读取多个可外部化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553038/

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