java学习笔记—实现一个类MyInputStream(28)
1 实现一个类MyInputStream读取文件,且不能抛出异常
public class TestDemo {
public static void main(String[] args) throws Exception {
InputStream in = new MyInputStream("d:/a/a.txt");
byte[] b = new byte[];
int len = ;
while((len=in.read(b))!=-){
String s = new String(b,,len);
System.err.print(s);
}
in.close();
}
}
class MyInputStream extends InputStream { //成为inputstream的子类,即is a.
private InputStream in;
public MyInputStream(String fileName) {
try {
in = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public int read(byte[] b){
int len=-;
try {
len = in .read(b);
} catch (IOException e) {
e.printStackTrace();
}
return len;
}
public void close(){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int read() throws IOException {
return ;
}
}
2 以下通过包装实现对close方法的修改,以回收连接
1:实现Connection接口,拥有一个Connection的成员。
2:修改close方法。
3:其他的方法都调用成员变量的connection。
public class MyDataSource implements DataSource {
private LinkedList<Connection> pool = new LinkedList<Connection>();
public MyDataSource() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///db909?characterEncoding=UTf8";
for (int i = ; i < ; i++) {
//创建原生的连接,// com.mysql.jdbc.JDBC4Connection@8888
Connection con = DriverManager.getConnection(url, "root",
"");
//声明包装类
MyConn conn = new MyConn(con);
pool.add(conn);//将包装类添加到池中去
}
} catch (Exception e) {
e.printStackTrace();
}
}
//此方法来自于datasource,用于返回一个连接
public Connection getConnection() throws SQLException {
synchronized (pool) {
if (pool.size() == ) {
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConnection();
}
Connection con = pool.removeFirst();
System.err.println("siize:" + pool.size());
return con;
}
}
以下包装connection
class MyConn implements Connection {
// 声明被包装类的成员
private Connection conn; //com.mysql.jdbc.Jdbc4Connection@1111 // 通过构造接收MySql的connection的对象JDBC4Connection@8888
public MyConn(Connection con) {
this.conn = con;
}
//关闭连接
public void close() throws SQLException {
synchronized (pool) {
//有人调用了关闭方法,不能关
System.err.println("有人还连接了。。。。"+this);
pool.add(this);
pool.notify();
}
}
}
3、用包装处理get方式的乱码
package cn.itcast.utils;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String methodName = req.getParameter("cmd");
try{
Method mm = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//声明包装类
MyRequest mr = new MyRequest(req);
mm.invoke(this,mr,resp);
}catch(Exception e){
e.printStackTrace();
}
}
}
//包装request
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest req;
public MyRequest(HttpServletRequest request) {
super(request);
this.req=request;
}
//修改getparameter方法
@Override
public String getParameter(String name) {
String value = req.getParameter(name);
if(req.getMethod().equals("GET")){
System.err.println("转码");
try{
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
}catch(Exception e){
}
}
return value;
}
}
总结:
1:代理或是包装都是对某个类的方法进行增强。
代理:必须要根据给定的接口,在内存中创建这个接口的子类。$Proxy0。
包装:不需要接口,但声明声明一个类,变成被包装类的子类,同时拥有一个被包装类的成员。
2:代理基本代码:
Object proxyedObj =
Proxy.newProxyInstance(ClassLoader,
New class[]{被代理的类的接口数组.class},
New InvocationHandler(){//执行句柄
Public Object invode(Object 代理,Method 方法反射,object[] args){
Reutrn method.invode(被代理类,args);
}
}
3:包装:
如果一个类是某个类的包装类,则:
A extends B{
Privet B b;
}
4:什么情况下,使用包装,什么情况下使用代理
如果官方(SUN)提供了包装类适配器,则应该优先使用包装。如HttpServletRequest,它的包装类就是HtpServletRequestWraper.
如果官方没有提供包装类的适配器,则可以使用动态代理。如Connection。
java学习笔记—实现一个类MyInputStream(28)的更多相关文章
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
- Java学习笔记16---抽象类与接口的浅显理解
抽象类是由abstract修饰的类,定义方式如public abstract class A{...}. 接口由interface修饰,定义方式如public interface B{...}. 抽象 ...
- 1.9(java学习笔记)object类及toString()与equals()方法
object类 java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类. 例如 class Person {......};和class Person e ...
- Java学习笔记5(类的入门以及ArrayList)
1.类的概念:将现实生活中的事物抽象成了代码(类),我们可以使用自定义的数组类型(类)来描述现实生活中的事物. 2.分析:用一部手机来分析,手机可以打电话,上网,听音乐,这些就是方法,手机有型号,颜色 ...
- 【原】Java学习笔记031 - 常用类
package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * 类 Math: ...
- 6.1(java学习笔记)File类
1.路径分隔符,文件分隔符. 路径分隔符(“:”) 文件名称分隔符(“\”windows,“/”Linux等). 不同平台使用的文件分隔符是不一样的,所以File类中提供了分隔符常量,它会根据平台的不 ...
- Java学习笔记day06_自定义类_ArrayList
1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...
- Java学习笔记(2)——有关类
Java类的高级特性: {Java管理文件机制:类包. 同一个包中的类互相访问时,可以不指定包名. 同一个包中的类不必存放在同一位置,如com.lang.class1和com.lang.class2可 ...
- Java学习笔记之——Object类
所有类的祖先 如果一个类没有显式继承,则继承Object 每一个类都直接或间接的是Object的子类 相关API: protected Objectclone() 创建并返回此对象的副本. boole ...
随机推荐
- fft 远程服务器返回错误 550返回码
"远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)"时,可能是如下原因: 1.URL路径不对,看看有没有多加空格,或者大小写问题 2.权限是否足 3.需 ...
- 2015年传智播客JavaEE 第168期就业班视频教程03-ERP简介(2)
资源管理这块的东西大家基本上能够猜个差不多了.下面描述描述计划.计划这个东西把企业资源这个东西提升了不只十倍二十倍了.ERP的核心是计划,但是这次我们做是不做计划的.今年我们是一个生产型企业,我们要开 ...
- 9.Palindrome Number (INT)
Determine whether an integer is a palindrome. Do this without extra space. class Solution { public: ...
- Win10 Cygwin Cd Permission denied
问题描述 在win10或者win系统上面,使用cygwin的时候, 有时候会出现, 权限问题. 即使是管理员也不行. 问题分析 这个问题,我个人觉得,主要是使用不当造成的. 也就是说, 可能使用chm ...
- [Training Video - 1] [Selenium Basics] [What is Selenium]
What is Selenium? Browser Automation Testings Tool: Mozilla IE 6,7,8 Google Chrome Opera 8,9,10 Safa ...
- myeclipse下对tomcat项目进行debug断点调试
对于eclipse或myeclipse调试J2SE项目或小应用进行断点调试,大家都不陌生,只要设置断点,debug运行就OK了.但是如果是web项目,而项目是在容器中运行的,比如tomcat,resi ...
- 如何用Python实现常见机器学习算法-4
四.SVM支持向量机 1.代价函数 在逻辑回归中,我们的代价为: 其中: 如图所示,如果y=1,cost代价函数如图所示 我们想让,即z>>0,这样的话cost代价函数才会趋于最小(这正是 ...
- 获取iOS设备唯一标识
[获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...
- 关于int转char类型引发的一些思考
signed char unsigned char
- 【转】java遍历实体类的属性和数据类型以及属性值
和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...