A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水蓝 中级黑马   /  2014-3-14 12:54  /  2636 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 水蓝 于 2014-3-15 00:29 编辑

URLConnection是一个应用层的类。
在学习过程中,类比了以下Socket中的操作。
Socket在获取流对象之后,虽然不要显式的关闭流对象。
但是,可以理解为,在Socket对象的close()方法中,被关闭了,或者显示的调用shutdownOutput()方法。

在URLConnection中,URLConnection本身既没有close()方法,也没有shutdown流之类的方法。
那我们在应用URLConnection的获取的流的过程中,是否要显式的去关闭流呢?


如下代码:
  1. public static void main(String[] args) throws IOException {
  2.                 //建立URL
  3.                 URL url = new URL("http://www.baidu.com");
  4.                 //根据URL获取应用层对象URLConnection,与主机产生连接
  5.                 URLConnection conn = url.openConnection();
  6.                 InputStream ips = conn.getInputStream();
  7.                 int len =0;
  8.                 byte[] buf = new byte[1024];
  9.                 while((len=ips.read(buf))>0) {
  10.                         System.out.print(new String(buf,0,len));
  11.                 }
  12.                 ips.close();                         //这个地方到底要不要显式的去关闭呢?
  13.         }
复制代码



评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

3 个回复

倒序浏览
// 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。   ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);      // 向对象输出流写出数据,这些数据将存到内存缓冲区中   objOutputStrm.writeObject(new String("我是测试数据"));      // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)   objOutputStm.flush();      // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,   // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器   objOutputStm.close();     
回复 使用道具 举报
百度来的  具体我也不太懂
URLConnection的连接、超时、关闭用法总结
Java中可以使用HttpURLConnection来请求WEB资源。

1、 URL请求的类别
分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。



2、URLConnection的对象问题
URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");  
  
URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的  
          // 请求协议(此处是http)生成的URLConnection类  
          // 的子类HttpURLConnection,故此处最好将其转化  
          // 为HttpURLConnection类型的对象,以便用到  
          // HttpURLConnection更多的API.如下:  
  
HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;  
3、HttpURLConnection对象参数问题
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在  
// http正文内,因此需要设为true, 默认情况下是false;  
httpUrlConnection.setDoOutput(true);  
  
// 设置是否从httpUrlConnection读入,默认情况下是true;  
httpUrlConnection.setDoInput(true);  
  
// Post 请求不能使用缓存  
httpUrlConnection.setUseCaches(false);  
  
// 设定传送的内容类型是可序列化的java对象  
// (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)  
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");  
  
// 设定请求的方法为"POST",默认是GET  
httpUrlConnection.setRequestMethod("POST");  
  
// 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成,  
        httpUrlConnection.connect();  
4、HttpURLConnection连接问题
// 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,  
// 所以在开发中不调用上述的connect()也可以)。  
OutputStream outStrm = httpUrlConnection.getOutputStream();
5、HttpURLConnection写数据与发送数据问题
// 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。  
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);  
  
// 向对象输出流写出数据,这些数据将存到内存缓冲区中  
objOutputStrm.writeObject(new String("我是测试数据"));  
  
// 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)  
objOutputStm.flush();  
  
// 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,  
// 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器  
objOutputStm.close();  
  
// 调用HttpURLConnection连接对象的getInputStream()函数,  
// 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。  
InputStream inStrm = httpConn.getInputStream(); // <===注意,实际发送请求的代码段就在这里  
  
// 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义,  
// 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流写入任何数据.  
// 因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据、  
// 重新发送数据(至于是否不用重新这些操作需要再研究)  
objOutputStm.writeObject(new String(""));  
httpConn.getInputStream();  
6、post参数的方法
OutputStream os = httpConn.getOutputStream();  
            String param = new String();  
            param = "CorpID=" + CorpID +  
                    "&LoginName=" + LoginName+  
                    "&send_no=" + phoneNumber +  
                    "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;  
            os.write(param.getBytes());  

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
Monkey·D·Chas 发表于 2014-3-14 20:15
百度来的  具体我也不太懂
URLConnection的连接、超时、关闭用法总结
Java中可以使用HttpURLConnection来请 ...

也就是说,ObjectOutputStream,已经被关闭了是吧?
不过挺意外的,底层传输的,居然不是纯byte封装的报文。
而是整成序列化的对象了。
谢谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马