1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.io.InputStreamReader;  
  5.  
  6. import org.apache.log4j.Logger;  
  7.  
  8. /**  
  9.  * <p>  
  10.  * 类名称: [解析InputStream工具类]  
  11.  * </p>  
  12.  * <p>  
  13.  * 类描述: [提供对InputStream解析方法]  
  14.  * </p>  
  15.  * <p>  
  16.  * 创建时间 8/3/11 4:24 PM  
  17.  * </p>  
  18.  *   
  19.  */ 
  20. public class InputStreamParseTool {  
  21.     /**  
  22.      * <p>  
  23.      * 属性描述: [日志]  
  24.      * </p>  
  25.      */ 
  26.     private static final Logger T_LOG = Logger  
  27.             .getLogger(InputStreamParseTool.class);  
  28.  
  29.     /**  
  30.      * <p>  
  31.      * 属性描述: [需要解析的InputStream]  
  32.      * </p>  
  33.      */ 
  34.     private InputStream in;  
  35.  
  36.     /**  
  37.      * <p>  
  38.      * 属性描述: [记录请求内容]  
  39.      * </p>  
  40.      */ 
  41.     private StringBuffer strBuff;  
  42.  
  43.     /**  
  44.      * <p>  
  45.      * 属性描述: [byte数组(解析时使用)]  
  46.      * </p>  
  47.      */ 
  48.     private byte b;  
  49.  
  50.     /**  
  51.      * <p>  
  52.      * 属性描述: []  
  53.      * </p>  
  54.      */ 
  55.     private int bit = 7;  
  56.  
  57.     /**  
  58.      * <p>  
  59.      * 方法描述: [解析工具构造方法]  
  60.      * </p>  
  61.      *   
  62.      * @param in  
  63.      *            解析工具构造方法  
  64.      */ 
  65.     public InputStreamParseTool(InputStream in) {  
  66.         this.in = in;  
  67.         strBuff = new StringBuffer();  
  68.     }  
  69.  
  70.     /**  
  71.      * <p>  
  72.      * 方法描述: [解析成字符串读取]  
  73.      * </p>  
  74.      *   
  75.      * @param len  
  76.      *            需要读取的长度  
  77.      *   
  78.      * @return 读取len长度后转换成的字符串  
  79.      *   
  80.      * @throws IOException  
  81.      *             抛出异常的原因  
  82.      */ 
  83.     public String readString(int len) throws IOException {  
  84.         byte[] b = new byte[len];  
  85.         bit = 7;  
  86.         if (in.read(b, 0, len) == -1) {  
  87.             strBuff.append(new String(b, "gbk"));  
  88.             throw new IOException();  
  89.         }  
  90.         strBuff.append(new String(b, "gbk"));  
  91.         return new String(b, "gbk");  
  92.     }  
  93.  
  94.  
  95.     /**  
  96.      *   
  97.      * <p>  
  98.      * Discription:[获取无符号数的8个bit位]  
  99.      * </p>  
  100.      *   
  101.      * @param b  
  102.      * @return  
  103.      * @author:[创建者中文名字]  
  104.      * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]  
  105.      */ 
  106.     public static String getBit(byte b) {  
  107.         StringBuffer sb = new StringBuffer();  
  108.         int[] bit = new int[8];  
  109.         int len = bit.length;  
  110.         for (int i = 0; i < len; i++) {  
  111.             bit[8 - i - 1] = (b >> i) & 1;  
  112.         }  
  113.         for (int i : bit) {  
  114.             sb.append(i);  
  115.         }  
  116.         return sb.toString();  
  117.  
  118.     }  
  119.  
  120.     /**  
  121.      * <p>  
  122.      * 方法描述: [从InputStream下一个byte开始读取len长度的byte转换成bit]  
  123.      * </p>  
  124.      *   
  125.      * @param len  
  126.      *            需要转换成比特的字节长度  
  127.      *   
  128.      * @return 二进制字符串  
  129.      *   
  130.      * @throws IOException  
  131.      *             抛出异常的原因  
  132.      */ 
  133.     public String readBit(int len) throws IOException {  
  134.         StringBuffer sb = new StringBuffer();  
  135.         byte ba;  
  136.         int j = len;  
  137.         while (j > 0) {  
  138.             ba = readByte();  
  139.             sb.append(getBit(ba));  
  140.             j--;  
  141.         }  
  142.         return sb.toString();  
  143.     }  
  144.       
  145.  
  146.     /**  
  147.      * <p>  
  148.      * 方法描述: [读取len长度的bit位]  
  149.      * </p>  
  150.      *   
  151.      * @return 返回结果的说明  
  152.      *   
  153.      * @throws IOException  
  154.      *             抛出异常的原因  
  155.      */ 
  156.     public String getBit(int len) throws IOException {  
  157.         StringBuffer sb = new StringBuffer();  
  158.         for(int i=0; i<len; i++){  
  159.             if ((bit < 0) || (bit == 7)) {  
  160.                 b = readByte();  
  161.                 bit = 7;  
  162.             }  
  163.             bit--;  
  164.             sb.append(readBit(b, bit));  
  165.         }  
  166.         return sb.toString();  
  167.     }  
  168.  
  169.     /**  
  170.      * <p>  
  171.      * 方法描述: [读取InputStream的下一个byte]  
  172.      * </p>  
  173.      *   
  174.      * @return byte  
  175.      *   
  176.      * @throws IOException  
  177.      *             抛出异常的原因  
  178.      */ 
  179.     public byte readByte() throws IOException {  
  180.         byte[] by = new byte[1];  
  181.         if (in.read(by, 01) == -1) {  
  182.             throw new IOException();  
  183.         }  
  184.         strBuff.append((char) by[0]);  
  185.         return (byte) (by[0] & 0xff);  
  186.     }  
  187.     /**  
  188.      * <p>  
  189.      * 方法描述: [跳过len长度的bit位]  
  190.      * </p>  
  191.      *   
  192.      * @param len  
  193.      *            需要跳过的长度  
  194.      *   
  195.      * @throws IOException  
  196.      *             抛出异常  
  197.      */ 
  198.     public void skipBit(int len) throws IOException {  
  199.         getBit(len);  
  200.     }  
  201.  
  202.     /**  
  203.      * <p>  
  204.      * 方法描述: [将流读取成字符串]  
  205.      * </p>  
  206.      *   
  207.      * @return 读取后的字符串  
  208.      *   
  209.      * @throws Exception  
  210.      *             抛出异常  
  211.      */ 
  212.     public String readToString() throws Exception {  
  213.         BufferedReader reader = new BufferedReader(new InputStreamReader(in));  
  214.         String line = null;  
  215.         StringBuffer str = new StringBuffer();  
  216.  
  217.         while ((line = reader.readLine()) != null) {  
  218.             str.append(line);  
  219.         }  
  220.         strBuff.append(str);  
  221.         return str.toString();  
  222.     }  
  223.  
  224.     /**  
  225.      * <p>  
  226.      * 方法描述: [读取source字节的第off位的bit值]  
  227.      * </p>  
  228.      *   
  229.      * @param source  
  230.      *            需要读取的字节  
  231.      * @param off  
  232.      *            读取第off位置的bit值  
  233.      *   
  234.      * @return 返回读取到的bit值  
  235.      */ 
  236.     private String readBit(byte source, int off) {  
  237.         int c = (source >> off) & 1;  
  238.         return String.valueOf(c);  
  239.     }  
  240.  
  241.     /**  
  242.      * <p>  
  243.      * 方法描述: [流关闭]  
  244.      * </p>  
  245.      */ 
  246.     public void closeStream() {  
  247.         try {  
  248.             if (in != null) {  
  249.                 in.close();  
  250.             }  
  251.         } catch (IOException e) {  
  252.             T_LOG.info("-->CANBUS服务-->TBox协议解析工具:请求流关闭失败!");  
  253.         }  
  254.     }  
  255.  
  256.     /**  
  257.      * <p>  
  258.      * 方法描述: [方法功能中文描述]  
  259.      * </p>  
  260.      *   
  261.      * @return 返回结果的说明  
  262.      */ 
  263.     public StringBuffer getStrBuff() {  
  264.         return strBuff;  
  265.     }  
  266.  
  267.     /**  
  268.      * <p>  
  269.      * 方法描述: [方法功能中文描述]  
  270.      * </p>  
  271.      *   
  272.      * @param strBuff  
  273.      *            参数说明  
  274.      */ 
  275.     public void setStrBuff(StringBuffer strBuff) {  
  276.         this.strBuff = strBuff;  
  277.     }  
  278. }