关于流式读取http body体内容

新手上路,请多包涵

如果采用octet-stream方式用http把一个很大的文件放入body体里传输。在服务端这种使用流的方式接收,时实时接收的吗?

public void downLoad(String remoteFileName, String localFileName) {
2 DefaultHttpClient httpClient = new DefaultHttpClient();
3 OutputStream out = null;
4 InputStream in = null;
5
6 try {
7 HttpGet httpGet = new HttpGet(URL_STR);
8
9 httpGet.addHeader("userName", userName);
10 httpGet.addHeader("passwd", passwd);
11 httpGet.addHeader("fileName", remoteFileName);
12
13 HttpResponse httpResponse = httpClient.execute(httpGet);
14 HttpEntity entity = httpResponse.getEntity(); // 获取流实体
15 in = entity.getContent(); // 获取流实体内容
16
17 long length = entity.getContentLength();
18 if (length <= 0) {
19 System.out.println("下载文件不存在!");
20 return;
21 }
22
23 System.out.println("The response value of token:" + httpResponse.getFirstHeader("token"));
24
25 File file = new File(localFileName);
26 if(!file.exists()){
27 file.createNewFile();
28 }
29
30 out = new FileOutputStream(file);
31 byte[] buffer = new byte[4096];
32 int readLength = 0;
33 while ((readLength=in.read(buffer)) > 0) { // 循环读取流内容,这里是客户端一边传输,服务端这里边读吗?如果是这样,如果文件很大,是不是会在这里循环很久。另外,这里while怎么能保证读取的是一个完整的文件?因为网络是断断续续的。这个异步的过程究竟是怎么样的?
34 byte[] bytes = new byte[readLength];
35 System.arraycopy(buffer, 0, bytes, 0, readLength);
36 out.write(bytes);
37 }
38
39 out.flush();
40
41 } catch (IOException e) {
42 e.printStackTrace();
43 } catch (Exception e) {
44 e.printStackTrace();
45 }finally{
46 try {
47 if(in != null){
48 in.close();
49 }
50 } catch (IOException e) {
51 e.printStackTrace();
52 }
53
54 try {
55 if(out != null){
56 out.close();
57 }
58 } catch (IOException e) {
59 e.printStackTrace();
60 }
61 }
62 }

阅读 7.5k
1 个回答

完全可以,参阅HttpServletRequest.getInputStream()

Servlet 3.1的话,还可以实时异步处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题