我正在编写一个使用对象输出和输入流的应用程序.但是我有一个问题,因为我无法正确发送我的对象.我将它写入流,并且服务器给我一个类未找到异常,即使客户端和服务器都具有完全相同的此类副本(唯一的区别是包名称)具有相同的序列ID.这是我的班级:
import java.io.Serializable;
public class Message implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String username = null;
private String hashedPassword = null;
private Integer code = null;
private String from = null;
private String to = null;
private Object data = null;
public Message() {
}
public Message(Integer code) {
this.code = code;
}
public Message(Integer code, Object data) {
this.code = code;
this.data = data;
}
public Message(String username, String hashedPassword, Integer …Run Code Online (Sandbox Code Playgroud) 在运行调试器时,程序暂停从服务器主输入输出流初始化对象流.以下是代码:
public TFileReader(Client cli)throws Exception{
this.cli = cli;
fileSock = new Socket(cli.ServerIp(), cli.FilePort());
fobjIn = new ObjectInputStream(fileSock.getInputStream());
fobjOut = new ObjectOutputStream(fileSock.getOutputStream());
fobjOut.flush();
}
@Override
public void run(){
try{
System.out.println("file reader thread online");
fobjOut.writeObject(cli.Name());
fobjOut.flush();
String per = (String) fobjIn.readObject();
System.out.println(per+"video filing...");
if(!per.equals("OKF"))
{
throw new Exception("Error In retriving video.");
}
Run Code Online (Sandbox Code Playgroud)
虽然它从断点传递但没有击中断点,它会暂停fobjIn并且不会执行.fobjOutfobjInfobjIn
这两者之间的主要区别是什么?
他们俩都是为了写字符串.
public void writeUTF(String str)
throws IOException
Primitive data write of this String in modified UTF-8 format.
Run Code Online (Sandbox Code Playgroud)
VS
public void writeBytes(String str)
throws IOException
Writes a String as a sequence of bytes.
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用一个而不是另一个?
使用输入/输出流在我的客户端和服务器之间传递对象.我可以用我的服务器发送和接收对象,现在我想要客户端,现在只能发送.所以我给了我的客户一个ObjectInputStream.然而,当我初学它时,它会阻止!一直在寻找答案,但没有解决方案.
请帮忙!
public GameConnection(String strPort, TextArea chat)
{
this.port = Integer.parseInt(strPort);
System.out.println("GameConnection::Constructor(): Connecting on port " + port);
this.chat = chat;
connect = new Connection();
sendObject();
}
public void sendObject()
{
try
{
obj_stream.writeObject(new String("GameServer received a message!"));
}
catch(Exception e){System.out.println("GameConnection::sendObject(): " + e);}
}
protected class Connection extends Thread
{
private boolean alive = true;
public Connection()
{
try
{
socket = new Socket(host, port);
System.out.println("Connected to GAMESERVER" + host + " on port + " + port);
obj_stream …Run Code Online (Sandbox Code Playgroud) 这个问题是关于 ObjectInputStream 以及它如何构建声明为瞬态的字段。考虑 ObjectInputStream 的一个简单用例
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
SomeClass sc = (SomeClass) ois.readObject();
Run Code Online (Sandbox Code Playgroud)
SomeClass 在哪里
class SomeClass {
int x;
transient OtherClass y;
}
class OtherClass {
int z;
}
Run Code Online (Sandbox Code Playgroud)
ois.readObject 之后 sc.y 的值是多少?
我要求澄清我在docs.oracle.com上读到的内容,其中指出
“反序列化过程会忽略声明为瞬态或静态的字段。对其他对象的引用会导致根据需要从流中读取这些对象。”
忽略瞬态场是什么意思?如果它们是瞬态的(即未序列化 - 我如何理解它......),如何从流中读取它们
马蒂亚斯
我有一个图片网址,例如
String url = "http://XXXXXXX/img_High-Octane-Sauce-Company-JP5-400x1024.jpg";
Run Code Online (Sandbox Code Playgroud)
我需要将其作为该方法的输入,
ImageInputStream in = ImageIO.createImageInputStream( urlInputHere );
Run Code Online (Sandbox Code Playgroud)
所以我可以在不使用图像缓冲区的情况下读取图像的宽度和高度。谁能告诉我如何做到这一点?
这是我阅读图像的方式
ImageInputStream in = ImageIO.createImageInputStream(resourceFile);
try {
final Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
if (readers.hasNext()) {
ImageReader reader = readers.next();
try {
reader.setInput(in);
return new Dimension(reader.getWidth(0), reader.getHeight(0));
} finally {
reader.dispose();
}
}
} finally {
if (in != null) in.close();
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 netty 客户端服务器进行通信。消息作为字节数组成功接收。当我将字节数组转换为 ObjectInputStream 时,出现异常
java.io.StreamCorruptedException: invalid stream header: 48656C6C
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at nettyClientServer2.PongHandler.messageReceived(PongHandler.java:99)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:88)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43)
at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67)
at org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
这就是我如何转换..
byte[] ppBytes=pptmp.status;
ObjectInputStream input = null;
input = new ObjectInputStream(new ByteArrayInputStream(ppBytes));
Run Code Online (Sandbox Code Playgroud) 我已将对象保存到数组列表并将文件保存为.dat,但是当我想要读取对象时,它只显示null而不是值.
班级
public class Person implements Serializable {
public static String Name;
public static String Contact;
public Person(String Name, String Contact) {
this.Name = Name;
this.Contact = Contact;
}
public String getName() {
return Name;
}
public String getContact() {
return Contact;
}
}
Run Code Online (Sandbox Code Playgroud)
代码
FileInputStream fis;
try {
fis = new FileInputStream("Person.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList<Person> per = (ArrayList<Person>) ois.readObject();
ois.close();
per.get(0);
Person pe = per.get(0);
System.out.println(pe.getName());
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block …Run Code Online (Sandbox Code Playgroud) 有不明白的地方,请大家帮忙。
System.out.println("\n" + Arrays.toString(buffer) + "\n");
System.out.println("buffer.length = " + buffer.length + "\nnew ByteArrayInputStream(buffer).available() is: " + new ByteArrayInputStream(buffer).available());
ObjectInput input = new ObjectInputStream(new ByteArrayInputStream(buffer));
System.out.println("input.available(): " + input.available());
Run Code Online (Sandbox Code Playgroud)
它的输出如下:
[-84, -19, 0, 5]
buffer.length = 4
new ByteArrayInputStream(buffer).available() is: 4
input.available(): 0
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么一个包含 4 个有效字节的字节数组在放入 ObjectInputStream 后变为零。
我尝试过的事情:
所以,我不知道为什么会发生这种情况。
请帮忙,非常感谢!
我的程序基本上是每日计划者.
计划按ObjectOutputStream按月和年保存在文件中.校验
时间表按天安排在一个数组中.校验
计划由ObjectInputStream检索.这是我遇到问题的地方.
public class Calendar {
public String date;
public String[] schedule = new String[31];
Calendar(){
}
public String retrieve(int month, int day, int year) {
date = Integer.toString(month) + "-"+ Integer.toString(year ) + ".txt";
try {
ObjectInputStream input = new ObjectInputStream(new
FileInputStream(date));
input.readObject();
schedule = input;
//This is where I have the error obviously schedule is a string array and
//input is an ObjectInputStream so this wont work
input.close();
return schedule[day-1];
} catch (FileNotFoundException e) {
// …Run Code Online (Sandbox Code Playgroud)