Url连接Inputstream和outputstream对象

时间:2012-03-13 10:48:41

标签: java url inputstream outputstream

这是我的代码

URL url = new URL("http://172.16.32.160:8080/epramaan/loginotp");
URLConnection connection1 = url.openConnection();
connection1.setDoOutput(true);

ObjectOutputStream out=new ObjectOutputStream(connection1.getOutputStream());
out.writeObject(send);
out.flush();
out.close();

ObjectInputStream in = new ObjectInputStream(connection1.getInputStream());
String output=(String)in.readObject();
in.close();

//Rest of the code

一旦OutputStream将数据写入流,对象InputStream是否会停止执行直到收到响应?

3 个答案:

答案 0 :(得分:1)

我假设通过停止执行你的意思是阻止。

注意到你正在使用readObject而不是读取。请详细说明您正在读/写的数据类型以及为什么使用对象流?

如你所说,你正在使用String,我建议使用方法readFully(byte[] buf)。此方法将阻塞,直到读取所有字节为止。获得字节数组后,从该字节数组中String can be created

答案 1 :(得分:1)

您可以使用InputStream.read(byte[])将整个字节数组读取到内存中(您可以从HTTP Content-Length标头获取数组长度)并使用URLConnection.setReadTimeout()进行超时,如果您也阻止了长。
从字节数组中,您可以构建对象,通过 ByteArrayInputStream构建 ObjectInputStream

答案 2 :(得分:1)

  

一旦OutputStream将数据写入流,对象InputStream是否会停止执行直到收到响应?

不准确。打开InputStream不会阻止任何内容,甚至导致发送请求标头。但是,从InputStream阅读将会同时完成这两项工作。

我怀疑您问题的真正原因是您从服务器获得的错误响应不是序列化对象;例如它可能是来自服务器的通用HTML错误页面。当然,尝试反序列化会失败。

正确的程序是:

  1. 创建URLConnection对象。
  2. 设置您需要的任何请求标头。
  3. 连接它(或跳过这个......它会隐式发生)。
  4. 打开并写入OutputStream。
  5. 关闭OutputStream。
  6. 使用getResponseCode()查看请求是成功还是失败。
    1. 如果成功,请调用getInputStream()并读取并处理响应。
    2. 如果失败,请调用getErrorStream()并处理错误输出。