`
benfreer
  • 浏览: 105139 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

HttpURLConnection请求数据流的写入(write)和读取(read)

 
阅读更多
摘自:http://www.blogjava.net/supercrsky/archive/2008/12/20/247446.html
觉得写的挺好的,自己的项目也用了这里的方法 实现了数据流的写入和写出

URLConnection类给应用程序和web资源之间架设起了通信的桥梁,这些web资源通常是通过url来标记的,本文将讲述如何使用HttpURLConnection来访问web页面(发送数据流)和读取数据流。

在Servlet中对于需要用post方式(get会暴露参数)写入参数的时候就用到了HttpURLConnection.

请求的Servlet,也可以写入main方法中进行测试
package com;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class IOServlet extends HttpServlet
{
    /**
     * 对于主动请求其它接口的参数流写入(POST方式)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        System.out.println("begin send");
        String inputParam = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><page><username>爱心天使</usernaem><age>26</age></page>";

        URL url = null;
        HttpURLConnection httpConn = null;
        OutputStream output = null;
        OutputStreamWriter outr = null;

        url = new URL("http://127.0.0.1:8888/iotest/ReadServlet");
        httpConn = (HttpURLConnection) url.openConnection();
        HttpURLConnection.setFollowRedirects(true);
        httpConn.setDoOutput(true);
        httpConn.setRequestMethod("POST");
        httpConn.setRequestProperty("Content-Type", "text/xml");
        httpConn.connect();
        output = httpConn.getOutputStream();
        outr = new OutputStreamWriter(output);
        // 写入请求参数
        outr.write(inputParam.toString().toCharArray(), 0, inputParam
                .toString().length());
        outr.flush();
        outr.close();
        System.out.println("send ok");
        int code = httpConn.getResponseCode();
        System.out.println("code " + code);
        System.out.println(httpConn.getResponseMessage());
        
        //读取响应内容
        String sCurrentLine = ""; 
        String sTotalString = ""; 
        if (code == 200)
        {
            java.io.InputStream is = httpConn.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is));
            while ((sCurrentLine = reader.readLine()) != null)
                if (sCurrentLine.length() > 0)
                    sTotalString = sTotalString + sCurrentLine.trim();
        } else
        {
            sTotalString = "远程服务器连接失败,错误代码:" + code;

        }
        System.out.println("response:" + sTotalString);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        this.doGet(request, response);
    }

}



ReadServlet(相当于被请求的服务器):

package com;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ReadServlet extends HttpServlet
{

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        System.out.println("begin read");
        ServletInputStream inStream = request.getInputStream(); // 取HTTP请求流
        int size = request.getContentLength(); // 取HTTP请求流长度
        byte[] buffer = new byte[size]; // 用于缓存每次读取的数据 
        byte[] in_b = new byte[size]; // 用于存放结果的数组
        int count = 0;
        int rbyte = 0;
        // 循环读取 
        while (count < size)
        { 
            rbyte = inStream.read(buffer); // 每次实际读取长度存于rbyte中 sflj
            for (int i = 0; i < rbyte; i++)
            {
                in_b[count + i] = buffer[i];
            }
            count += rbyte;
        }
        System.out.println("result:" + new String(in_b,0,in_b.length));
        
        response.setContentType("text/html");
        //注意响应中文数据时要设置
        response.setCharacterEncoding("GBK");
        PrintWriter out = response.getWriter();
        //回与响应数据
        out.write("您已经请求成功,这是响应数据!");
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        this.doGet(request, response);
    }

}



打开页面:http://localhost:8888/iotest/IOServlet

你会在后台看到如下输出说明你已经成功了:
begin send
send ok
begin read
result:<?xml version="1.0" encoding="UTF-8"?><page><username>爱心天使</usernaem><age>26</age></page>
code 200
OK
response:您已经请求成功,这是响应数据!
分享到:
评论

相关推荐

    远程连接服务器HttpURLConnection

    接下来,我们可以设置请求方法(如GET或POST),并启用输入/输出流以便读取和写入数据: ```java connection.setRequestMethod("POST"); // 或 "GET" connection.setDoOutput(true); // 对于POST请求,表示有数据要...

    Android-使用HttpURLConnection实现断点续传

    建立与服务器的连接后,创建InputStream读取服务器数据,同时创建FileOutputStream准备写入本地文件。如果下载中断,我们将从已下载的`downloadedSize`位置开始写入。 ```java InputStream in = connection....

    HttpURLConnection用法详解

    对于POST、PUT等需要发送数据的请求,可以使用setDoOutput(true)开启输出流,然后写入数据: ```java connection.setDoOutput(true); try(OutputStream out = connection.getOutputStream()) { out.write(jsonData....

    Java利用HttpURLConnection发送post请求上传文件.docx

    通过不断读取`ServletInputStream`,并将数据写入到文件,我们可以看到上传的文件和参数以特定格式存储。 以下是一些关键点: 1. **分隔符**:每个文件或参数都由一个唯一的分隔符开始,如`----------------------...

    HttpURLConnection实现单线程下载,多线程下载,多线程续点下载

    4. 使用BufferedInputStream和BufferedOutputStream读取服务器数据并写入本地文件。 5. 关闭所有流。 ```java URL url = new URL("http://example.com/file"); HttpURLConnection conn = (HttpURLConnection) url....

    HttpUrlConnection下载文件

    代码中使用循环读取流中的数据,并将其写入到本地文件中。 ```java InputStream inStream = httpUrlConnection.getInputStream(); byte[] data = new byte[1024]; int len; while ((len = inStream.read(data)) &gt; 0...

    HttpURLConnection访问网页下载图片示例代码

    4. 创建缓冲区并读取输入流中的数据,每次读取后将其写入到输出流。 5. 读取完整个输入流后关闭所有流。 下面是一个简单的示例代码: ```java import java.io.BufferedInputStream; import java.io....

    使用HttpURLConnection进行网络编程

    首先,需要设置请求头以接受二进制数据,然后使用`DataInputStream`和`FileOutputStream`进行读写操作: ```java connection.setRequestProperty("Accept", "*/*"); connection.setDoOutput(true); DataInputStream...

    Netroid框架和HttpURLConnection类的文件下载demo

    5. **文件下载**:通过循环读取输入流的数据,写入到本地文件中,同时监控下载速度。 6. **关闭连接**:操作完成后,务必调用`disconnect()`关闭连接,释放资源。 **文件下载示例** 为了测量文件下载速度,我们...

    通过字节流将文本,视频,图片下载到存储卡,里面包含权限的请求,可在Android Studio成功运行

    可以创建一个`File`对象指定目标路径,然后使用`FileOutputStream`的`write()`方法将字节流写入文件。 5. **进度条更新**: 示例中提到了`ProgressBar`,在实际的文件下载过程中,你可以使用`HttpURLConnection`或...

    android之通过HttpURLConnection类查看网络图片、源码例子

    4. 保存图片:将读取的数据写入本地文件。 5. 显示图片:使用`BitmapFactory`解析本地文件,然后设置到ImageView。 示例代码如下: ```java try { connection.setRequestMethod("GET"); connection.setDoInput...

    数据通信-成为Android数据流大师

    ### 数据通信—成为Android数据流大师 #### 一、SD卡概述及深层次介绍 SD(Secure Digital)卡是一种被广泛使用的存储卡格式,主要用于增加移动设备的存储空间。在Android设备中,SD卡通常用于存储应用程序数据、...

    Android中http请求及文件读写操作方法

    文件操作需注意权限问题,例如,访问外部存储需要在AndroidManifest.xml中声明`WRITE_EXTERNAL_STORAGE`和`READ_EXTERNAL_STORAGE`权限。 1. **读文件**:使用`java.io`包中的`FileInputStream`和`BufferedReader`...

    文件下载保存、并读取文件*(输出文件字符串、文件流)

    文件流分为输入流(用于读取)和输出流(用于写入)。在Python中,`open(filename, 'r')`创建一个只读文件流,`open(filename, 'w')`则创建一个只写文件流。文件流提供了高级功能,如缓冲、错误处理和自动关闭文件等...

    网络连接及单线程多线程下载示例

    HttpURLConnection的使用步骤通常包括:打开连接、设置请求方法、添加请求头、获取输入流进行读取等。例如,要发送GET请求,可以这样操作: ```java URL url = new URL("http://example.com"); HttpURLConnection ...

    Android---网络交互之客户端请求服务端资源.doc

    如果SD卡可用,我们可以创建一个FileOutputStream对象来将网络数据流写入文件: ```java File dir = null; File file = null; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { ...

    根据指定网址,提供参数,返回图片数据

    `BufferedInputStream`和`FileOutputStream`分别用于读取远程图片数据和将数据写入本地文件系统。`bis = new BufferedInputStream(connection.getInputStream())`创建了一个缓冲输入流,用于从网络连接中读取数据。`...

    Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    // 写入JSON数据到输出流 outputStream = urlConnection.getOutputStream(); outputStream.write(jsonString.getBytes("UTF-8")); outputStream.flush(); // 获取响应码 int statusCode = urlConnection....

    Java用文件流下载网络文件示例代码_java_

    每次从网络输入流中读取一定数量的数据(这里设置为1024字节),然后将其写入到本地文件输出流。当没有更多的数据可读(即`read()`方法返回-1)时,循环结束,文件下载完成。 最后,记得关闭所有打开的流以释放资源...

    JAVA文件传输(源代码).rar

    3. **数据流封装**:为了将文件内容通过网络发送,需要将文件流封装到Socket或HttpURLConnection的数据流中。这通常涉及使用BufferedInputStream和BufferedOutputStream来提高性能,并通过connect()和write()方法...

Global site tag (gtag.js) - Google Analytics