項目中消息的格式化方法


在很多項目中經常打印Log,返回操作之后的響應消息給客戶端等都會涉及到消息的格式化,一般都是會有一個消息模板,然后傳入一些特定的參數值達到項目的需要。在Java中處理方式一般有以下三種:

1. 使用StringBuilder

使用一個StringBuilder對象進行封裝,然后toString傳給終端,OK,這個是很普遍的做法,只是在代碼上不是很美觀,但是性能在本文中三個方案中應該是最高的。假設有這樣一個場景,需要對用戶登陸消息進行Log。

        String username = "Jack";
        StringBuilder sb = new StringBuilder();
        sb.append(username)
                .append(" login system at ")
                .append(new Date());
        logger.info(sb.toString());

2. 使用String.format

String類也提供了format()方法可以對消息進行格式化,這種方式是依賴通配符完成的,一般操作是這樣的:

        String username = "Jack";
        logger.info(String.format("%s login system at %s", username, new Date()));

 

3. 使用MessageFormat

        String username = "Jack";
        logger.info(MessageFormat.format("{0} login system at {1,date,yyyy-MM-dd HH:mm:ss}", username, new Date()));

MessageFormat則使用的是占位符,占位符可以配置的元素有以下幾種,應該很好理解,可以對日期和Number類型的參數做格式化:

 { ArgumentIndex }
 { ArgumentIndex , FormatType }
 { ArgumentIndex , FormatType , FormatStyle }

在不是特別care性能可以使用MessageFormat更加靈活,代碼也會更加美觀。

我做了一個簡單的耗時測試,各執行1000w次:

如下代碼:

       String username = "Jack";
        long start = System.currentTimeMillis();
        for (int i=0; i<10000000; i++) {
            StringBuilder sb = new StringBuilder();
            sb.append(username)
                    .append(" login system at ")
                    .append(new Date());
//            logger.info(sb.toString());
        }
        long end1 = System.currentTimeMillis();
        for (int i=0; i<10000000; i++) {
            String.format("%s login system at %s", username, new Date());
//            logger.info(String.format("%s login system at %s", username, new Date()));
        }
        long end2 = System.currentTimeMillis();
        for (int i=0; i<10000000; i++) {
//            logger.info(MessageFormat.format("{0} login system at {1,date,yyyy-MM-dd HH:mm:ss}", username, new Date()));
            MessageFormat.format("{0} login system at {1,date,yyyy-MM-dd HH:mm:ss}", username, new Date());
        }
        long end3 = System.currentTimeMillis();

        System.out.println("Stringbuilder cost: " + (end1 - start));
        System.out.println("String.format cost: " + (end2 - end1));
        System.out.println("MessageFormat cost: " + (end3 - end2));

結果輸出:

Stringbuilder cost: 5468
String.format cost: 19969
MessageFormat cost: 34434

執行次數很少的話基本上都差不多,這里也給出執行100次的時間:

Stringbuilder cost: 13
String.format cost: 17
MessageFormat cost: 18

然后看了一下CPU,MessageFormat也是要高一點的

關心MessageFormat更詳細的使用,可以參見:http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM