疯狂Java讲义中的程序,使用代理服务器来获取网上的资源

来源:互联网 发布:cst软件价格 编辑:程序博客网 时间:2024/05/21 09:34

        今天在学到关于如何使用代理服务器来获取网上的资源这个程序时发现了两个问题:一是每次跟换代理服务器时非常麻烦而且都是需要更改源代码并重新编译运行,二是如果你从网上下载的是一个网页,比如"http://www.baidu.com/index.html",你会发现文件中保存的全部是乱码,无法用浏览器打开。下面是解决问题的过程

        第一个问题,很简单,我直接想到了使用配置文件,这个时候我查找到了Properties类(其实记忆力忘记是Property还是Properties了,还好有文档),通过查找里面的方法成功的实现了使用配置文件来修改代理服务器的ip、端口、目标网址。不过我随之想到了另外一个问题,代理的IP和端口其实是经常变化的,很有可能今天能用,明天就失效了,所以我在想是否可以从代理网址上抓取网页,通过字符串匹配来找到网页上存放的IP、端口,然后使用ProxySelector来自动选择这些代理服务器,从而实现,无需手动更换代理服务器,避免在运行的程序时代理中断的问题。这个代码由于时间的关系,我暂时没有实现。

        第二个问题,其实我想多了,原先在想问题的原因肯定是字符集的问题,在读取数据并写入输入流的时候没有设置好字符集,但是在如何设置字符集的时候忘记了,从FileInputStream、DataInputSteam、ByteArrayInputStream一个个文档,后来发现书上给的源程序使用的Scanner类,这个类读取的字节流,如果你在这个类的基础上想实现字符集的设置很困难,所以我想到了应该使用字符流,第一个想到的就是BufferedReader,然后一查API,里面还是没有设置字符集的方法,后来发现字符集其实是在从字节流到字符流的过程中设置,所以的解决方法就是

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        回顾了一下解决问题的过程,发现自己对文档的熟悉程度还不够,解决问题的关键点在于--字符集是作用的地方就是从字节流向字符流转换的过程中。下面贴上完整的代码。


package org.xn.chapter17.demo;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.InetSocketAddress;import java.net.MalformedURLException;import java.net.Proxy;import java.net.URL;import java.net.URLConnection;import java.util.Properties;public class ProxyPropertyTest {//下面是定义的代理服务器的地址和端口//并且定义个配置文件,这里使用的一个配置文件来做的String PROXY_ADDR;int PROXY_PORT;String urlStr;Properties iniProxy = new Properties();public void init() throws IOException, MalformedURLException {iniProxy.load(new FileInputStream("ini/proxy.ini"));//从配置文件中读取数据,为各个变量赋值PROXY_ADDR = iniProxy.getProperty("PROXY_ADDR");PROXY_PORT = Integer.parseInt(iniProxy.getProperty("PROXY_PORT")); urlStr = iniProxy.getProperty("urlStr");URL url = new URL(urlStr);//定义代理服务器,代理服务器由:协议、IP、端口号组成Proxy pro = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT));//获取URLConnection对象,这里就需要传入一个Proxy类的实例URLConnection conn = url.openConnection(pro);//设置超时时长conn.setConnectTimeout(3000);try (PrintStream ps = new PrintStream(new FileOutputStream("index.html"));BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));){String line;while ((line = br.readLine()) != null) {System.out.println(line);ps.println(line);}} catch (IOException ioe) {ioe.printStackTrace();}}public static void main(String[] args) throws Exception, MalformedURLException {new ProxyPropertyTest().init();}}


————————下面这段话是文章放表后的第二天所添加

        真的应了我上面那句话,对文档的属性程度还不够,原来在Scanner里面就有一个设置字符集的构造方法,只不过它的API文档上的说明没有写字符集这三个字,而我也没有点到下面的详细信息区查看,我在此纠正,使用Scanner类也是可以的,只需要使用如下的构造方法即可:

Scanner scan = new Scanner(conn.getInputStream(), "UTF-8");


0 0