摘自: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:您已经请求成功,这是响应数据!
分享到:
相关推荐
接下来,我们可以设置请求方法(如GET或POST),并启用输入/输出流以便读取和写入数据: ```java connection.setRequestMethod("POST"); // 或 "GET" connection.setDoOutput(true); // 对于POST请求,表示有数据要...
建立与服务器的连接后,创建InputStream读取服务器数据,同时创建FileOutputStream准备写入本地文件。如果下载中断,我们将从已下载的`downloadedSize`位置开始写入。 ```java InputStream in = connection....
对于POST、PUT等需要发送数据的请求,可以使用setDoOutput(true)开启输出流,然后写入数据: ```java connection.setDoOutput(true); try(OutputStream out = connection.getOutputStream()) { out.write(jsonData....
通过不断读取`ServletInputStream`,并将数据写入到文件,我们可以看到上传的文件和参数以特定格式存储。 以下是一些关键点: 1. **分隔符**:每个文件或参数都由一个唯一的分隔符开始,如`----------------------...
4. 使用BufferedInputStream和BufferedOutputStream读取服务器数据并写入本地文件。 5. 关闭所有流。 ```java URL url = new URL("http://example.com/file"); HttpURLConnection conn = (HttpURLConnection) url....
代码中使用循环读取流中的数据,并将其写入到本地文件中。 ```java InputStream inStream = httpUrlConnection.getInputStream(); byte[] data = new byte[1024]; int len; while ((len = inStream.read(data)) > 0...
4. 创建缓冲区并读取输入流中的数据,每次读取后将其写入到输出流。 5. 读取完整个输入流后关闭所有流。 下面是一个简单的示例代码: ```java import java.io.BufferedInputStream; import java.io....
首先,需要设置请求头以接受二进制数据,然后使用`DataInputStream`和`FileOutputStream`进行读写操作: ```java connection.setRequestProperty("Accept", "*/*"); connection.setDoOutput(true); DataInputStream...
5. **文件下载**:通过循环读取输入流的数据,写入到本地文件中,同时监控下载速度。 6. **关闭连接**:操作完成后,务必调用`disconnect()`关闭连接,释放资源。 **文件下载示例** 为了测量文件下载速度,我们...
可以创建一个`File`对象指定目标路径,然后使用`FileOutputStream`的`write()`方法将字节流写入文件。 5. **进度条更新**: 示例中提到了`ProgressBar`,在实际的文件下载过程中,你可以使用`HttpURLConnection`或...
4. 保存图片:将读取的数据写入本地文件。 5. 显示图片:使用`BitmapFactory`解析本地文件,然后设置到ImageView。 示例代码如下: ```java try { connection.setRequestMethod("GET"); connection.setDoInput...
### 数据通信—成为Android数据流大师 #### 一、SD卡概述及深层次介绍 SD(Secure Digital)卡是一种被广泛使用的存储卡格式,主要用于增加移动设备的存储空间。在Android设备中,SD卡通常用于存储应用程序数据、...
文件操作需注意权限问题,例如,访问外部存储需要在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 ...
如果SD卡可用,我们可以创建一个FileOutputStream对象来将网络数据流写入文件: ```java File dir = null; File file = null; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { ...
`BufferedInputStream`和`FileOutputStream`分别用于读取远程图片数据和将数据写入本地文件系统。`bis = new BufferedInputStream(connection.getInputStream())`创建了一个缓冲输入流,用于从网络连接中读取数据。`...
// 写入JSON数据到输出流 outputStream = urlConnection.getOutputStream(); outputStream.write(jsonString.getBytes("UTF-8")); outputStream.flush(); // 获取响应码 int statusCode = urlConnection....
每次从网络输入流中读取一定数量的数据(这里设置为1024字节),然后将其写入到本地文件输出流。当没有更多的数据可读(即`read()`方法返回-1)时,循环结束,文件下载完成。 最后,记得关闭所有打开的流以释放资源...
3. **数据流封装**:为了将文件内容通过网络发送,需要将文件流封装到Socket或HttpURLConnection的数据流中。这通常涉及使用BufferedInputStream和BufferedOutputStream来提高性能,并通过connect()和write()方法...