JAva学習ノート-クラスMyInputStreamを実現(28)

14432 ワード

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[1024];

        int len = 0;

        while((len=in.read(b))!=-1){

            String s = new String(b,0,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=-1;

        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 0;

    }

}

2以下は包装によりclose方法の修正を実現し、接続を回収する
1:Connectionインタフェースを実装し、Connectionのメンバーを1つ持つ.
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 = 0; i < 3; i++) { 

                //// com.mysql.jdbc.JDBC4Connection@8888

                Connection con = DriverManager.getConnection(url, "root",

                        "1234");

                // 

                MyConn conn = new MyConn(con); 

                pool.add(conn);// 

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    // datasource, 

    public Connection getConnection()  throws SQLException {

        synchronized (pool) {

            if (pool.size() == 0) {

                try {

                    pool.wait();

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                return getConnection();

            }

            Connection con = pool.removeFirst();

            System.err.println("siize:" + pool.size());

            return con;

        }

    }

次のパッケージ
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)にパッケージアダプタが提供されている場合は、パッケージを優先的に使用する必要があります.HttpServeretRequestのように、そのパッケージクラスはHtpServeretRequestWraperである.
パッケージクラスのアダプタが公式に提供されていない場合は、ダイナミックエージェントを使用できます.接続の場合.