點點滴滴(Java)

native2ascii
    在WINDOWS平臺下編寫的資源文件,以GB2312方式編碼,在編譯時需要轉碼,以確保在各個平臺上的正確性
    編碼:
        native2ascii -encoding utf8 temp.properties ApplicationResources_zh_CN.properties
    反編碼:
        native2ascii -reverse

Java取內存信息
    Runtime.getRuntime().maxMemory(); // 虛擬機可以控制的最大內存數量
    Runtime.getRuntime().totalMemory(); // 虛擬機當前已經使用的內存數量

JVM設置內存參數
    -Xms<size> set initial Java heap size 設置JVM初始化堆內存大小
    -Xmx<size> set maximum Java heap size 設置JVM最大的堆內存大小
    -Xss<size> set java thread stack size 設置JVM棧內存大小

Tomcat的java調試

    Java的調試功能是JVM自帶的,
    新建debug.bat文件, 寫入以下內容, 運行該文件啓動Tomcat即可與Eclipse遠程調試
    set JPDA_ADDRESS=8888
    set JPDA_TRANSPORT=dt_socket
    set JAVA_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%
    startup

Jsp下載選項
    // attachment:作爲附件下載 | inline:在線打開
    response.setHeader("Content-Disposition", "attachment; filename=/"" + fileName + "/";");
    // 一定要保證沒有做過關於禁止瀏覽器緩存的操作
    // response.setHeader("Pragma", "No-cache");
    // response.setHeader("Cache-Control", "No-cache");
    // response.setDateHeader("Expires", 0);

Java反射判斷方法有沒有返回值
    method.getReturnType() == void.class // 沒有返回值

Java命名規範
    PASCAL命名法, 用於類名, 每個單詞的首字母大寫, 例如ProductType
    CAMEL命名法, 也叫駝峯命名法, 用於變量,方法名, 首個單詞的首字母小寫, 其餘單詞的首字母大寫, 例如productType

Java類修飾符(官方順序)
    public
    protected
    private
    abstract
    static
    final
    transient
    volatile
    synchronized
    native
    strictfp
    interface

Java繪圖
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics = image.createGraphics();
    graphics.setColor(Color.black);
    graphics.drawLine(x1, y1, x2, y2);
    graphics.fillRect(x, y, width, height);
    graphics.drawString(string, x, y);
    // 設置字體
    Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(foneFileName)); // ttf字體文件名
    font = font.deriveFont(Font.PLAIN, 20);
    graphics.setFont(font);
    graphics.drawString(string, x, y);
    graphics.dispose(); // 完成
    ImageIO.write(image, "jpeg", new File(fileName));

Java圖片縮放
    public static void scaledImage1(String src, String dest, int width, int height)
            throws Exception {
        BufferedImage srcImage = ImageIO.read(new File(src));
        BufferedImage destImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        destImage.getGraphics().drawImage(srcImage, 0, 0, width, height, null);
        ImageIO.write(destImage, "jpeg", new File(dest));
    }
    public static void scaledImage2(String src, String dest, int width, int height)
            throws Exception {
        BufferedImage srcImage = ImageIO.read(new File(src));
        double ratioX = new Integer(width).doubleValue() / srcImage.getWidth();
        double ratioY = new Integer(height).doubleValue() / srcImage.getHeight();
        AffineTransformOp op =
                new AffineTransformOp(AffineTransform.getScaleInstance(ratioX, ratioY), null);
        BufferedImage destImage = op.filter(srcImage, null);
        ImageIO.write(destImage, "jpeg", new File(dest));
    }

Dom操作
    創建dom節點:
        // <users><user id="10001">Alex</user></users>
        DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document dom = domBuilder.newDocument();
        Element usersNode = dom.createElement("users"); // <users></users>
        dom.appendChild(usersNode);
        Element userNode = dom.createElement("user"); // <user></user>
        userNode.setAttribute("id", "10001"); // <user id="10001"></user>
        userNode.appendChild(dom.createTextNode("Alex")); // <user id="10001">Alex</user>
        usersNode.appendChild(userNode);
    將dom對象保存到文件:
        // 創建文件
        String xmlFileFullPath = "d:/data/user.xml"; // 應確保存在該物理路徑, 物理文件可不存在
        File xmlFile = new File(xmlFileFullPath);
        FileOutputStream fileStream = new FileOutputStream(xmlFile);
        // 創建轉換器
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty("encoding", "UTF-8");
        // 創建轉換源
        DOMSource source = new DOMSource(dom.getDocumentElement());
        // 創建轉換目標
        StreamResult result = new StreamResult(fileStream);
        // 轉換
        transformer.transform(source, result);
    遍歷dom節點:
        Collection userCollection = new Collection();
        DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        // 解析XML文件
        Document dom = domBuilder.parse(xmlFileFullPath);
        if (dom != null && dom.hasChildNodes()) {
            Node usersNode = beansConfigDom.getFirstChild(); // <users>節點
            if (usersNode != null && usersNode.hasChildNodes()) {
                // 遍歷dom節點
                Node userNode = usersNode.getFirstChild(); // <user>節點
                while (userNode != null) {
                    if ("user".equals(userNode.getNodeName())) {
                        UserBean userBean = new UserBean();
                        if (userNode.hasChildNodes()) {  // <user>節點的文本
                            Node textNode = node.getFirstChild();
                            userBean.setUserName(textNode == null ? null : textNode.getNodeValue());
                        }
                        if (userNode.hasAttributes()) {  // <user>節點的id屬性
                            Node attribute = node.getAttributes().getNamedItem("id");
                            userBean.setUserId(attribute == null ? null : attribute.getNodeValue());
                        }
                        userCollection.add(userBean);
                    }
                    userNode = userNode.getNextSibling(); // 下一個<user>節點
                }
            }
        }

獲取工程絕對路徑
    假定StrutsDemo工程下有demo.Test類
    1.Test.class.getResource("")
        得到的是當前類Test.class文件的URI目錄。不包括自己!
        如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/demo/
    2.Test.class.getResource("/")
        得到的是當前的classpath的絕對URI路徑。
        如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
    3.Test.class.getClassLoader().getResource("")
        得到的也是當前ClassPath的絕對URI路徑。
        如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
    4.Thread.currentThread().getContextClassLoader().getResource("")
        得到的也是當前ClassPath的絕對URI路徑。
        如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
    5.ClassLoader.getSystemResource("")
        得到的也是當前ClassPath的絕對URI路徑。
        如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/

    Web工程通過ServletContext.getRealPath("/")獲取工程絕對路徑
    public class MyListener implements ServletContextListener {
        private ServletContext context = null;
        public void contextInitialized(ServletContextEvent event)...{
            this.context = event.getServletContext();
            System.out.println(this.context.getRealPath("/"));
        }
        public void contextDestroyed(ServletContextEvent event){
            this.context = null;
        }
    }

Java字符編碼
    String str ="漢";
    // 取得GB2312編碼的字節
    byte[] bytesGB2312 = str.getBytes("GB2312");
    // 取得平臺缺省編碼的字節(solaris爲ISO8859_1,windows爲GB2312)
    byte[] bytesDefault = str.getBytes();
    // 用指定的編碼將字節轉換成字符串
    String newStrGB = new String(bytesGB2312, "GB2312");
    // 用平臺缺省的編碼將字節轉換成字符串(solaris爲ISO8859_1,windows爲GB2312)
    String newStrDefault = new String(bytesDefault);
    // 用指定的編碼從字節流裏面讀取字符
    InputStream in = xxx;
    InputStreamReader reader = InputStreamReader(in, "GB2312");
    char aChar = reader.read();
    
    在Tomcat中,由Request.getParameter()獲取的參數,編碼方式都是ISO8859_1
        在Servlet規範中,可以通過request.setCharacterEncoding("GB2312");來改變獲取參數的編碼方式
    JSP頁面中charset的作用:
        1. JSP文件的編碼方式: 在生成JAVA類時,源JSP文件中漢字的編碼
        2. JSP輸出流的編碼方式: 在執行JSP時,往response流裏面寫入數據的編碼方式
    在往response流裏面寫數據前可以調用response.setContentType()來改變寫入數據的編碼方式

Tomcat配置虛擬目錄映射
    (Tomcat50/conf/server.xml)
    <Context path="/control" docBase="F:/control/web" debug="0" privileged="true" reloadable="true" />

Java文件操作
    try {
        streamIn = file.getInputStream();
        streamOut = new FileOutputStream(dir + "/" + fileName);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        while ((bytesRead = streamIn.read(buffer,0,8192))!=-1) {
            streamOut.write(buffer, 0, bytesRead);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            streamIn.close();
            streamOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        file.destroy();
    }

拆分字符串
    1. StringTokenizer對於連續的分隔符如||會識別爲一個分隔符
    String src = "50001|stephen||1980-12-27";
    StringTokenizer tokenizer = new StringTokenizer(src, "|");
    while(tokenizer.hasMoreTokens()) {
        System.out.println(tokenizer.nextToken());
    }
    2. split的參數是正則表達式
    String src = "50001|stephen||1980-12-27";
    String[] array = src.split("\\|");
    for(int i=0; i < array.length; i++) {
        System.out.println(array[i]);
    }

Request對象的主要方法 
    setAttribute(String name, Object obj): 設置名字爲name的request的參數值
    removeAttribute(String name): 刪除請求中的一個屬性
    getAttribute(String name): 返回由name指定的屬性值
    getAttributeNames(): 返回request對象所有屬性的名字集合,結果是一個枚舉的實例
    getCookies(): 返回客戶端的所有Cookie對象,結果是一個Cookie數組
    getCharacterEncoding(): 返回請求中的字符編碼方式
    getContentLength(): 返回請求的Body的長度
    getHeader(String name): 獲得HTTP協議定義的文件頭信息
    getHeaders(String name): 返回指定名字的request Header的所有值,結果是一個枚舉的實例
    getHeaderNames(): 返回所以request Header的名字,結果是一個枚舉的實例
    getInputStream(): 返回請求的輸入流,用於獲得請求中的數據
    getMethod(): 獲得客戶端向服務器端傳送數據的方法
    getParameter(String name): 獲得客戶端傳送給服務器端的有name指定的參數值
    getParameterNames(): 獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例
    getParameterValues(String name): 獲得有name指定的參數的所有值
    getProtocol(): 獲取客戶端向服務器端傳送數據所依據的協議名稱
    getQueryString(): 獲得查詢字符串(只能獲取到通過GET方法請求的參數), 如: type=1&operate=0
    getRequestURL(): 獲取絕對請求地址, 如: http://127.0.0.1/user/test.jsp
    getRequestURI(): 獲取相對請求地址, 如: /user/test.jsp
    getLocalAddr(): 獲取服務端的IP地址
    getLocalName():
    getRemoteAddr(): 獲取客戶端的IP地址
    getRemoteHost(): 獲取客戶端的名字
    getSession([Boolean create]): 返回和請求相關Session
    getServerName(): 獲取服務器的名字
    getServerPort(): 獲取服務器的端口號
    getServletPath(): 獲取客戶端所請求的腳本文件的路徑

獲取客戶端IP
    /*
     * 獲取用戶IP: request.getRemoteAddr(), 這種方法在大部分情況下都是有效的。
     * 但是在用戶使用了Apache,Squid等反向代理軟件的情況下,
     * 用戶訪問某頁面, 其實並不是用戶瀏覽器真正訪問到了服務器上的頁面文件,
     * 而是先由代理服務器去訪問頁面文件, 再將訪問到的結果返回給用戶的瀏覽器,
     * 因此getRemoteAddr()獲取到的實際上是代理服務器的IP, 並不是用戶真實IP。
     * 但是在轉發請求的HTTP頭信息中, 增加了類似於x-forwarded-for的信息,
     * 用以跟蹤原來的客戶端IP地址
     */
    String ip = request.getHeader("x-forwarded-for");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }

JSP文件頭編碼
    <%@ page contentType="text/html; charset=UTF-8" %>
    <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>

隨機數
    new java.util.Random().nextInt()使用當前時間即System.currentTimeMillis()作爲發生器的種子
    new java.util.Random(long seed).nextInt()使用指定的seed作爲發生器的種子
    取得x到y之間的隨機數
        如果得到的是int或long型的隨機數,則使用公式 random % x + y 取得
        如果得到的是0到1的double型隨機數,則使用公式 random * (x - y + 1) + x 取得

正則表達式向左預查
    Pattern splitor = Pattern.compile("(?<!\\\\)\\|"); // 左邊不爲\的|
    String src = "13900000000|zhaohuihua|abc\\|123";
    String[] ary = splitor.split(src);
    System.out.println(splitor.pattern());
    for(int i = 0; i < ary.length; i++) {
        System.out.println(ary[i]);
    }
    輸出:
    (?<!\\)\|
    13900000000
    zhaohuihua
    abc\|123

發佈了30 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章