java 학습 노트 - 클래스 MyInputStream 구현(28)

14486 단어 Inputstream
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 멤버를 보유합니다.
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;

        }

    }

아래 포장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

좋은 웹페이지 즐겨찾기