我正在开发一个Client-Server项目(你可以称之为"广播聊天"),但我遇到了ObjectInputStream的问题.它总是检索我一个空列表,我找到了解决方案,但我不知道为什么它的工作原理...
这是有问题的代码(检查服务器的sendMsg()函数):
服务器:
public class CoreServer implements Runnable {
private Socket sock;
private ServerConnect sc;
private ObjectOutputStream oos;
private ObjectInputStream ois;
private boolean running=true;
private List<String> lstr;
public CoreServer(Socket sock, ServerConnect sc) {
this.sock=sock;
this.sc=sc;
}
@Override
public void run() {
lstr=new LinkedList<String>();
try {
oos= new ObjectOutputStream(sock.getOutputStream());
ois=new ObjectInputStream(sock.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
while (running){
Object o=null;
try {
o= ois.readObject();
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
sc.remove(this);
stop();
} …Run Code Online (Sandbox Code Playgroud) 我正在使用ObjectOutputStream将数据写入文件。以下是代码段。
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)))
{
oos.writeObject(allObjects);
}
Run Code Online (Sandbox Code Playgroud)
问题:
文件损坏后,我看到的问题是在调试时遇到了上述查询。
我有这三个类:
命令:
package pack;
public abstract class Command impements java.io.Serializable
{
public abstract void execute();
}
Run Code Online (Sandbox Code Playgroud)
客户:
package pack;
// imports....
public class Client
{
Socket socket;
// Constructor...
public void sendCommand(Command c)
{
try
{
new ObjectOuputStream(socket.getOutputStream()).writeObject(c);
} catch (Exception e) {e.printStackTrace()};
}
}
Run Code Online (Sandbox Code Playgroud)
MyKeyListener:
此keylistener将添加到JFrame中的组件中.
public class MyKeyListener implements KeyListener
{
private Client client;
public MyKeyListener(Client c)
{ client = c; }
public void keyTyped(....)......; // This method does nothing
public void keyPressed(KeyEvent e)
{
client.sendCommand(new Command() { …Run Code Online (Sandbox Code Playgroud) 我最近想出了如何使用ObjectOutputStream和ObjectInputStream通过服务器和客户端之间的简单Java套接字连接发送对象.我想知道我是否想要传输一个可能很大的对象,例如一个图像,是否可以设置一个线程来跟踪已经发送/接收了多少数据的进度?如果这个问题的答案不是很直接,有人可以解释一下我可能会做些类似的事吗?提前致谢!
我正在编写简单的客户端 - 服务器应用程序,但我有这个愚蠢的问题(它简化了示例(当我不使用java序列化时一切正常)):
ServerSocket serversocket=null;
Socket socket=null;
String slowo=null;
try {
serversocket=new ServerSocket(8877);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
socket=serversocket.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
slowo=(String)ois.readObject();
Run Code Online (Sandbox Code Playgroud)
我的编译器显示:
Serwer.java:51: cannot …Run Code Online (Sandbox Code Playgroud) 我正在编写一个jUnit测试,检查类将什么写入ObjectOutputStream。
具体来说,我正在检查一个类是否正在以某种类型调用writeObject:
ObjectOutputStream out = mock(ObjectOutputStream.class);
out.writeObject(new Something());
verify(out).writeObject(isA(Something.class));
Run Code Online (Sandbox Code Playgroud)
但是Java抱怨里面有NullPointerException writeObject。
我需要存根解决此问题吗?
我使用ObjectOutputStream来保存对象,但是当我使用.writeObject(this)将其保存为文件时,无法保存该材料.我定义的类已经可序列化了.
public class LanguageModel implements Serializable {
private static LanguageModel lm_;
/* ******************************* */
//word -> count(w)
public static Dictionary unigramDict = new Dictionary();
//word_pair -> count(wi,wi+1)
public static Dictionary bigramDict = new Dictionary();
private static int wordIdCounter = 0;
/* ***************************** */
// Do not call constructor directly since this is a Singleton
private LanguageModel(String corpusFilePath) throws Exception {
constructDictionaries(corpusFilePath);
}
public void constructDictionaries(String corpusFilePath)
throws Exception {
...
}
// Saves the object (and all associated data) to …Run Code Online (Sandbox Code Playgroud) 我做了一个小的基准测试,发现ObjectOutputStream.writeObject速度比ObjectOutputStream.write(byte[] bytes)我快,但我似乎无法找到可能的解释,因为在引擎盖下,writeObject将ObjectOutputStream.write(byte[] bytes)间接调用
测试代码
public static void main(String[] args) throws Exception {
byte[] bytes = new byte[10000];
for (int i = 0; i < 10000; ++i) {
bytes[i] = (byte) (i % 256);
}
ByteArrayOutputStream out2 = new ByteArrayOutputStream();
try(ObjectOutputStream ostream2 = new ObjectOutputStream(out2)) {
for (int i = 0; i < 10000; ++i) {
ostream2.writeInt(bytes.length);
ostream2.write(bytes, 0, bytes.length);
}
out2.reset();
long start = System.nanoTime();
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud) 这是我的客户端代码:
\n\n公共类 ABCServlet 扩展 HttpServlet {
\n\nprotected void doGet(HttpServletRequest request,\n HttpServletResponse response){\n//do blah blah\nString msg = null;\n\njava.io.OutputStream os = response.getOutputStream();\njava.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(os);\noos.writeObject(msg);\nmsg = null;\noos.flush();\noos.close();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道如何使用上面的代码我的监听器被启动 -
\n\npublic class ABCListener implements MessageListener {\n\n@Override\npublic void onMessage(Message arg0) {\n AbstractJDBCFacade fa\xc3\xa7ade = null;\n try{\n fa\xc3\xa7ade = something;\n throw new UserException();\n }catch(UserException ex){\n log.error("ABC Exception " + ex);\n }\nRun Code Online (Sandbox Code Playgroud)\n\n配置 :
\n\n<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">....\n\n<bean id="jmsQueue" class="org.springframework.jndi.JndiObjectFactoryBean">\n\n<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer102">\nRun Code Online (Sandbox Code Playgroud)\n\n我有 3 个问题:\n1. 如果不显式地将其放入队列,如何调用侦听器?\n2. 当 onMessage 方法抛出 …
关于该方法writeObject(Object obj)从ObjectOutputStream类
从Javadocs:
将指定的对象写入ObjectOutputStream。写入对象的类,类的签名以及该类及其所有超类型的非瞬态和非静态字段的值。
声明是什么
对象的类别
意思?这是否意味着将.class文件写入该文件或该类的源代码或仅写入该类的名称?