今天在学到关于如何使用代理服务器来获取网上的资源这个程序时发现了两个问题:一是每次跟换代理服务器时非常麻烦而且都是需要更改源代码并重新编译运行,二是如果你从网上下载的是一个网页,比如"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");

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

  1. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  2. java下载pdf6_疯狂java讲义第6版 电子版(pdf格式)

    疯狂java讲义第6版pdf是李刚打造的经典java编程图书的最新版,为了帮助更多的读者能真正掌握Java编程,感受到Java语言的魅力,领会到Java编程的快乐,作者根据多年来的Java授课经验,精 ...

  3. 《疯狂Java讲义》学习笔记 第六章 面向对象(下)

    <疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...

  4. [疯狂Java讲义精粹] 第十三章|类加载机制与反射

    java.lang.reflect包下的接口和类, 包括Class, Method, Filed,Constructor和Array等, 这些类分别代表类, 方法, Field, 构造器和数组, Ja ...

  5. 《疯狂Java讲义》读书笔记5

    目录 Java的集合类 Inerator 接口 Set 集合 HashSet 类 LinkedHashSet 类 TreeSet 类 EnumSet 类 List 集合 ArrayList 和 Vec ...

  6. 《疯狂JAVA讲义》学习笔记(一)

    本人之前一直从事iOS开发,最近开始接触Eclipse插件开发,打算先重拾一下扔了很久的Java.看到大家都在网上推荐李刚的<疯狂JAVA讲义>,于是下了一本开始学习.以下为前七章本人记录 ...

  7. 疯狂Java讲义(六)----第四部分

    1.枚举类 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象.这种实例有限而且固定的类,在Java里被称为枚举类. 在早期代码中,可能会直接使用简 ...

  8. 疯狂java讲义第五章课后习题答案

    1.编写一个学生类,提供name.age.gender.phone.address.cmail成员变量,且为每个成员变量提供 seter.geter方法.为学生类提供默认的构造器和带所有成员变量的构造 ...

  9. 学习《疯狂Java讲义第4版》PDF+代码+课件+面试题分析

    学习java选择了<疯狂java讲义>最新的第四版,用了两个多月时间看完,一边阅读,一边敲代码.对Java有了不少新的认识.书中实例清晰明了,讲解也是娓娓道来.Java可以编写图形桌面系统 ...

最新文章

  1. 在线作图|如何画韦恩图(包含upset图)
  2. 动态SQL语句--mybatis
  3. android Butter Knife 使用详解
  4. for java_Java For循环
  5. 神策数据入选《2020 爱分析·数据智能厂商全景报告》
  6. 解决导入的maven聚合工程中子模块项目不显示
  7. 2019牛客暑期多校训练营(第二场)
  8. 《基于MFC的OpenGL编程》Part 8 Colors
  9. left join on、where后面的条件的区别
  10. 怎样在安卓中实现在锁屏状态下弹出对话框,并可以震动和铃声,就像闹钟似的?...
  11. Unity_线性空间
  12. 使用java+OpenCV进行图片对比并标记差异部分(支持中文图片路径)
  13. 上海各IT培训机构深度比较
  14. 设置Hbuildx实现编译less的快捷键
  15. TiED:人类组织特异性增强子数据库
  16. react-router 里的 routerLink标签和a 标签有什么区别
  17. 关于考证(已通过高项、CISA、CISSP、HCIP、RHCE)
  18. 基于51单片机的8八路抢答器设计
  19. frame和iframe的区别
  20. 出海商家涌向东南亚,先行一步的跨境MCN是引流捷径吗?

热门文章

  1. C#Task执行线程及其相关问题
  2. 【毕业设计】机器学习二维码识别检测系统 - python opencv 机器视觉
  3. [转] 网站性能优化之------------- 数据库及服务器架构篇
  4. 计算机机房网络维护日志,机房网络设备维护方案.doc
  5. 百度语音识别之拼音识别
  6. 给到工作的你诗和远方~
  7. 2016.06工作日志
  8. 01背包问题 动态规划求解方法 动态方程的详细解释 能理解的解释(附python代码)
  9. 2022年小游戏----游戏背包系统之自定义填充背包和切换背包页面
  10. Android 注解与注解处理器简述