浏览 1734 次
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-02
HTTP/1.1 200 OK Date: Sun, 02 Aug 2009 08:49:22 GMT Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8k DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Last-Modified: Thu, 04 Jun 2009 15:36:14 GMT ETag: "78878f-49e-46b87893bd780" Accept-Ranges: bytes Content-Length: 1182 Connection: close Content-Type: text/plain 我想把这段过滤掉,因为这不是文件本身应有的数据,各位有什么好的方法吗? 我试过的方法:附加的代码中方法download()。把读取的字节流转成字符串,判断两个“回车换行”的位置,取子字符串再转成字节保存。虽然这方法能把把这段响应信息过滤掉,但是打开文件显示已损坏,我想应该是转为字符串时编码出了问题,导致再转回字节时出了问题。 附上我的源代码,请各位给个思路 package net; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Arrays; import java.util.List; public class HTTPDownload { /** * 过滤响应字符串; */ public static void download() throws IOException{ //建立Socket链接 Socket socket = new Socket("www.chentaoqian.com",80); //构造请求字符串 StringBuffer sb = new StringBuffer(); sb.append("GET ").append("/test.rar ").append("HTTP/1.1\r\n"); sb.append("Host:www.chentaoqian.com\r\n"); sb.append("Accept:*/*\r\n"); sb.append("User-Agent:GeneralDownloadApplication\r\n"); sb.append("Connection:close\r\n\r\n"); // System.out.println("send command."); //发送请求 OutputStream socketOut = socket.getOutputStream(); socketOut.write(sb.toString().getBytes()); socket.shutdownOutput(); // System.out.println("start receive."); //开始接收数据 InputStream socketIn = socket.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] buff = new byte[1024]; int len = -1; boolean flag = false; //标识是否已完成响应信息过滤;true-完成,false-未完成 String temp = ""; while((len=socketIn.read(buff))!=-1){ if(flag == false){ //过滤响应信息; //因为响应信息出现在响应流的一开始并且以两个回车换行结束("\r\n\r\n"),所以以此做判断; temp += new String(buff); if(temp.indexOf("\r\n\r\n") != -1){ // buff = temp.substring(temp.indexOf("\r\n\r\n")+4).getBytes(); // len = buff.length; buffer.write(buff, temp.indexOf("\r\n\r\n"), temp.substring(temp.indexOf("\r\n\r\n")+4).getBytes().length); flag = true; } continue; }else{ buffer.write(buff,0,len); } } System.out.println(buffer.toString()); //将数据写入文件保存; File f = new File("./aaaa.rar"); FileOutputStream fos = new FileOutputStream(f); buffer.writeTo(fos); fos.close(); socketIn.close(); socketOut.close(); socket.close(); System.out.println("文件保存到:"+f.getAbsolutePath()); } /** * 没有过滤响应字符串; */ public static void download2() throws IOException{ //建立Socket链接 Socket socket = new Socket("www.chentaoqian.com",80); //构造请求字符串 StringBuffer sb = new StringBuffer(); sb.append("GET ").append("/test.rar ").append("HTTP/1.1\r\n"); sb.append("Host:www.chentaoqian.com\r\n"); sb.append("Accept:*/*\r\n"); sb.append("User-Agent:GeneralDownloadApplication\r\n"); sb.append("Connection:close\r\n\r\n"); // System.out.println("send command."); //发送请求 OutputStream socketOut = socket.getOutputStream(); socketOut.write(sb.toString().getBytes()); socket.shutdownOutput(); // System.out.println("start receive."); //开始接收数据 InputStream socketIn = socket.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] buff = new byte[1024]; int len = -1; while((len=socketIn.read(buff))!=-1){ buffer.write(buff,0,len); } // System.out.println(buffer.toString()); //将数据写入文件保存; File f = new File("./aaaa2.rar"); FileOutputStream fos = new FileOutputStream(f); buffer.writeTo(fos); fos.close(); socketIn.close(); socketOut.close(); socket.close(); System.out.println("文件保存到:"+f.getAbsolutePath()); } /** * @param args */ public static void main(String[] args) throws Exception { HTTPDownload.download(); // HTTPDownload.download2(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-02
http下载程序 干嘛要用socket建立连接?
|
|
返回顶楼 | |
发表时间:2009-08-02
beckrabbit 写道 http下载程序 干嘛要用socket建立连接?
那要怎么做比较好,我是因为看到关于socket发送HTTP请求的文章才想到用socket读取数据。 beckrabbit可以给个思路吗? |
|
返回顶楼 | |
发表时间:2009-08-02
try this:
http://hc.apache.org/httpclient-3.x/ |
|
返回顶楼 | |