首先需要明确的一点是,不管是磁盘还是网络传输,最小的存储单元都是字节,所以 I/O 操作的都是字节而不是字符。
当我们需要用java发送http请求的时候,通常会用apache的commons-httpclient包。只要新建一个HttpClient,设置编码,设定超时时间,传入url执行GetMethod或者PostMethod方式进行发送就能返回一个byte数组。然后根据需要,将返回的字节流转换成字符串或者文件。
这个本质上跟从浏览器发起请求是一样的,服务端的处理没有差异。一般服务端在返回的时候会调用HttpServletResponse对象的setContentType方法进行设置,用于说明返回字节流的类型,这样浏览器接收到返回信息就能知道这个时候是该给用户展示一个字符串还是一张网页还是提示用户下载保存文件。
以下是java客户端收发http请求的代码:
package test.IO;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class TestHttpIO {
private static String url = "*********";
private static String filePath = "*********";
private static final String CONTENT_CHARSET = "UTF-8";
public void writeFileFromUrl() {
byte[] responce = getUrl(url);
// 如果网络返回的是字符串
String str = new String(responce);// 注意,一般情况下这边需要指定编码格式,不指定的话会使用系统默认的编码格式
BufferedWriter bw;
try {
bw = new BufferedWriter(new FileWriter(filePath));
bw.write(str);
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
// 如果网络返回是文件
OutputStream os;
try {
os = new FileOutputStream(new File(filePath));
os.write(responce);
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] getUrl(String url) {
HttpClient client = new HttpClient();
client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,
CONTENT_CHARSET);
client.setTimeout(10000);
GetMethod method = new GetMethod(url);
try {
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
throw new RuntimeException("服务器响应错误[" + statusCode + "]");
}
byte[] responseBody = null;
responseBody = method.getResponseBody();
return responseBody;
} catch (HttpException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
method.releaseConnection();
client.getHttpConnectionManager().closeIdleConnections(0);
}
}
}