JAVA演示阿里云圖像識(shí)別API,印刷文字識(shí)別-營(yíng)業(yè)執(zhí)照識(shí)別
最近有由于需要,我開始接觸阿里云的云市場(chǎng)的印刷文字識(shí)別-營(yíng)業(yè)執(zhí)照識(shí)別這里我加上了官網(wǎng)的申請(qǐng)說明,只要你有阿里云賬號(hào)就可以用,前500次是免費(fèi)的,API說明很簡(jiǎn)陋,只能做個(gè)簡(jiǎn)單參考。
一、API介紹
JAVA示例:
public static void main(String[] args) {
   String host = "https://dm-58.data.aliyun.com";
   String path = "/rest/160601/ocr/ocr_business_license.json";
   String method = "POST";
   String appcode = "你自己的AppCode";
   Map<String, String> headers = new HashMap<String, String>();
   //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appcode);
   //根據(jù)API的要求,定義相對(duì)應(yīng)的Content-Type
   headers.put("Content-Type", "application/json; charset=UTF-8");
   Map<String, String> querys = new HashMap<String, String>();
   String bodys = "{\"image\":\"對(duì)圖片內(nèi)容進(jìn)行Base64編碼\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils請(qǐng)從
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下載
   *
   * 相應(yīng)的依賴請(qǐng)參照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
   System.out.println(response.toString());
   //獲取response的body
   //System.out.println(EntityUtils.toString(response.getEntity()));
   } catch (Exception e) {
   e.printStackTrace();
   }
 }
返回碼:
{
  "config_str" : "null\n", #配置字符串信息
  "angle" : float, #輸入圖片的角度(順時(shí)針旋轉(zhuǎn)),[0, 90, 180,270]
  "reg_num" : string, #注冊(cè)號(hào),沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "name" : string, #公司名稱,沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "type" : string, #公司類型,沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "person" : string, #公司法人,沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "establish_date": string, #公司注冊(cè)日期(例:證件上為"2014年04月16日",算法返回"20140416")
  "valid_period": string, #公司營(yíng)業(yè)期限終止日期(例:證件上為"2014年04月16日至2034年04月15日",算法返回"20340415")
  #當(dāng)前算法將日期格式統(tǒng)一為輸出為"年月日"(如"20391130"),并將"長(zhǎng)期"表示為"29991231",若證件上沒有營(yíng)業(yè)期限,則默認(rèn)其為"長(zhǎng)期",返回"29991231"。
  "address" : string, #公司地址,沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "capital" : string, #注冊(cè)資本,沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "business": string, #經(jīng)營(yíng)范圍,沒有識(shí)別出來時(shí)返回"FailInRecognition"
  "emblem" : string, #國(guó)徽位置[top,left,height,width],沒有識(shí)別出來時(shí)返回"FailInDetection"
  "title" : string, #標(biāo)題位置[top,left,height,width],沒有識(shí)別出來時(shí)返回"FailInDetection"
  "stamp" : string, #印章位置[top,left,height,width],沒有識(shí)別出來時(shí)返回"FailInDetection"
  "qrcode" : string, #二維碼位置[top,left,height,width],沒有識(shí)別出來時(shí)返回"FailInDetection"
  "success" : bool, #識(shí)別成功與否 true/false
  "request_id": string
}
購(gòu)買后,在云市場(chǎng)列表里展示,你可要點(diǎn)擊進(jìn)去查看AppCode等其主要信息(接口調(diào)用里需要AppCode)
簡(jiǎn)單的API介紹,但挺有效了的,唯一不好的就是沒有錯(cuò)誤返回碼的描述,需要自己測(cè)試。
二、代碼開發(fā)
閑話少說,上代碼:
AliyunImageRecognitionUtil :阿里云圖像識(shí)別工具類
package com.casic.cloud.qcy.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import com.alibaba.fastjson.JSONObject;
import com.casic.cloud.qcy.constant.Constants;
import sun.misc.BASE64Encoder;
/** 
 * @ClassName: AliyunImageRecognitionUtil 
 * @Description: 阿里云圖像識(shí)別工具類
 * @author: tianpengw
 * @date 2019年3月21日 上午8:49:08 
 * 
 */
public class AliyunImageRecognitionUtil {
 private static String businessLicenceHost = PropertiesUtil.getProperties("businessLicenceHost");
 
 private static String businessLicencePath = PropertiesUtil.getProperties("businessLicencePath");
 
 private static String method = "POST";
 
 private static String appCode = PropertiesUtil.getProperties("appCode");
 
 /**
 * 
 * @Description: 根據(jù)文件全路徑識(shí)別
 * @author: tianpengw
 * @param imgPath
 * @return
 */
 public static Map<String,Object> bussinessLicenceRecognition(String imgPath){
 Map<String,Object> resultMap = new HashMap<String,Object>();
 
 Map<String, String> headers = new HashMap<String, String>();
 //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appCode);
   headers.put("Content-Type", "application/json; charset=UTF-8");
   
   Map<String, String> querys = new HashMap<String, String>();
   String bodys = "{\"image\":\""+imageToBase64Str(imgPath)+"\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils請(qǐng)從
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下載
   *
   * 相應(yīng)的依賴請(qǐng)參照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
   String resStr = EntityUtils.toString(response.getEntity());
   System.out.println(resStr);
   
   resultMap = JSONObject.parseObject(resStr, Map.class);
   //獲取response的body
   } catch (Exception e) {
   e.printStackTrace();
   }
   return resultMap;
 }
 
 /**
 * 
 * @Description: 根據(jù)InputStream識(shí)別
 * @author: tianpengw
 * @param imgPath
 * @return
 */
 public static Map<String,Object> bussinessLicenceRecognition(InputStream inputStream){
 Map<String,Object> resultMap = new HashMap<String,Object>();
 
 Map<String, String> headers = new HashMap<String, String>();
 //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appCode);
   headers.put("Content-Type", "application/json; charset=UTF-8");
   
   Map<String, String> querys = new HashMap<String, String>();
   // 加密
   BASE64Encoder encoder = new BASE64Encoder();
   byte[] data = null;
   try {
    data = new byte[inputStream.available()];
    inputStream.read(data);
    inputStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   String bodys = "{\"image\":\""+encoder.encode(data)+"\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils請(qǐng)從
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下載
   *
   * 相應(yīng)的依賴請(qǐng)參照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
   String resStr = EntityUtils.toString(response.getEntity());
   System.out.println(resStr);
   
   resultMap = JSONObject.parseObject(resStr, Map.class);
   resultMap.put("errCode", Constants.RESULT_SUCCESS);
   //獲取response的body
   } catch (Exception e) {
   e.printStackTrace();
   resultMap.put("errCode", Constants.RESULT_FAIL);
   }
   return resultMap;
 }
 /**
 * 
 * @Description: 根據(jù)byte[]識(shí)別
 * @author: tianpengw
 * @param imgPath
 * @return
 */
 public static Map<String,Object> bussinessLicenceRecognition( byte[] data){
 Map<String,Object> resultMap = new HashMap<String,Object>();
 
 Map<String, String> headers = new HashMap<String, String>();
 //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appCode);
   headers.put("Content-Type", "application/json; charset=UTF-8");
   
   Map<String, String> querys = new HashMap<String, String>();
   // 加密
   BASE64Encoder encoder = new BASE64Encoder();
   
   String bodys = "{\"image\":\""+encoder.encode(data)+"\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils請(qǐng)從
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下載
   *
   * 相應(yīng)的依賴請(qǐng)參照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
   String resStr = EntityUtils.toString(response.getEntity());
   System.out.println(resStr);
   
   resultMap = JSONObject.parseObject(resStr, Map.class);
   resultMap.put("errCode", Constants.RESULT_SUCCESS);
   //獲取response的body
   } catch (Exception e) {
   e.printStackTrace();
   resultMap.put("errCode", Constants.RESULT_FAIL);
   }
   return resultMap;
 }
 
 /**
  * 圖片轉(zhuǎn)base64字符串
  * @param imgFile 圖片路徑
  * @return
  */
  public static String imageToBase64Str(String imgFile) {
   InputStream inputStream = null;
   byte[] data = null;
   try {
    inputStream = new FileInputStream(imgFile);
    data = new byte[inputStream.available()];
    inputStream.read(data);
    inputStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   // 加密
   BASE64Encoder encoder = new BASE64Encoder();
   return encoder.encode(data);
  }
  
  public static void main(String[] args) {
 String imgPath = "d:/yyzznew1.jpg";
 Map<String,Object> map = AliyunImageRecognitionUtil.bussinessLicenceRecognition(imgPath);
 System.out.println(map.get("person"));
 System.out.println(map.get("reg_num"));
 }
}
AliyunHttpUtils :阿里云httpUtils
package com.casic.cloud.qcy.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
/** 
 * @ClassName: AliyunHttpUtils 
 * @Description: 
 * @author: tianpengw
 * @date 2019年3月21日 上午8:44:51 
 * 
 */
public class AliyunHttpUtils {
 /**
 * get
 * 
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @return
 * @throws Exception
 */
 public static HttpResponse doGet(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpGet request = new HttpGet(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    
    return httpClient.execute(request);
  }
 
 /**
 * post form
 * 
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param bodys
 * @return
 * @throws Exception
 */
 public static HttpResponse doPost(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys, 
  Map<String, String> bodys)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpPost request = new HttpPost(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    if (bodys != null) {
      List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
      for (String key : bodys.keySet()) {
        nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
      }
      UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
      formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
      request.setEntity(formEntity);
    }
    return httpClient.execute(request);
  } 
 
 /**
 * Post String
 * 
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPost(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys, 
  String body)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpPost request = new HttpPost(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    if (StringUtils.isNotBlank(body)) {
     request.setEntity(new StringEntity(body, "utf-8"));
    }
    return httpClient.execute(request);
  }
 
 /**
 * Post stream
 * 
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPost(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys, 
  byte[] body)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpPost request = new HttpPost(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    if (body != null) {
     request.setEntity(new ByteArrayEntity(body));
    }
    return httpClient.execute(request);
  }
 
 /**
 * Put String
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPut(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys, 
  String body)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpPut request = new HttpPut(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    if (StringUtils.isNotBlank(body)) {
     request.setEntity(new StringEntity(body, "utf-8"));
    }
    return httpClient.execute(request);
  }
 
 /**
 * Put stream
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPut(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys, 
  byte[] body)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpPut request = new HttpPut(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    if (body != null) {
     request.setEntity(new ByteArrayEntity(body));
    }
    return httpClient.execute(request);
  }
 
 /**
 * Delete
 * 
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @return
 * @throws Exception
 */
 public static HttpResponse doDelete(String host, String path, String method, 
  Map<String, String> headers, 
  Map<String, String> querys)
      throws Exception {   
   HttpClient httpClient = wrapClient(host);
   HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }
    
    return httpClient.execute(request);
  }
 
 private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
   StringBuilder sbUrl = new StringBuilder();
   sbUrl.append(host);
   if (!StringUtils.isBlank(path)) {
   sbUrl.append(path);
    }
   if (null != querys) {
   StringBuilder sbQuery = new StringBuilder();
     for (Map.Entry<String, String> query : querys.entrySet()) {
     if (0 < sbQuery.length()) {
      sbQuery.append("&");
     }
     if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
      sbQuery.append(query.getValue());
        }
     if (!StringUtils.isBlank(query.getKey())) {
      sbQuery.append(query.getKey());
      if (!StringUtils.isBlank(query.getValue())) {
      sbQuery.append("=");
      sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
      }      
        }
     }
     if (0 < sbQuery.length()) {
     sbUrl.append("?").append(sbQuery);
     }
    }
   
   return sbUrl.toString();
  }
 
 private static HttpClient wrapClient(String host) {
 HttpClient httpClient = new DefaultHttpClient();
 if (host.startsWith("https://")) {
  sslClient(httpClient);
 }
 
 return httpClient;
 }
 
 private static void sslClient(HttpClient httpClient) {
    try {
      SSLContext ctx = SSLContext.getInstance("TLS");
      X509TrustManager tm = new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
          return null;
        }
        public void checkClientTrusted(X509Certificate[] xcs, String str) {
         
        }
        public void checkServerTrusted(X509Certificate[] xcs, String str) {
         
        }
      };
      ctx.init(null, new TrustManager[] { tm }, null);
      SSLSocketFactory ssf = new SSLSocketFactory(ctx);
      ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
      ClientConnectionManager ccm = httpClient.getConnectionManager();
      SchemeRegistry registry = ccm.getSchemeRegistry();
      registry.register(new Scheme("https", 443, ssf));
    } catch (KeyManagementException ex) {
      throw new RuntimeException(ex);
    } catch (NoSuchAlgorithmException ex) {
     throw new RuntimeException(ex);
    }
  }
}
PropertiesUtil :讀取配置文件工具
package com.casic.cloud.qcy.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/** 
 * @ClassName: PropertiesUtil 
 * @Description: 
 * @author tianpengw
 * @date 2018年6月27日 下午3:09:08 
 * 
 */
public class PropertiesUtil {
 private static Logger log = LogManager.getLogger(PropertiesUtil.class);
 
 private static Properties prop;
 
 static{
 try{
  if(null == prop){
  prop = new Properties();
  }
  InputStream fis = null;
  fis = ClassLoaderUtils.getResourceAsStream("common.properties", PropertiesUtil.class);
  if(fis!=null){
  prop.load(fis);// 將屬性文件流裝載到Properties對(duì)象中  
  fis.close();// 關(guān)閉流  
  }
 }catch (Exception e) {
  log.error("讀取配置文件出錯(cuò):" + e );
 }
 }
 
 /**
 * 
 * @Description: 根據(jù)key獲取配置的值
 * @author tianpengw 
 * @param key
 * @return
 */
 public static String getProperties(String key){
 if(key==null) return null;
 return prop.getProperty(key);
 
 }
 
 
 /**
 * 
 * @Description: 
 * @author tianpengw 
 * @param proper 讀取配置的文件名稱
 * @param key
 * @return
 */
 public static String getPropertie(String resourceName,String key){
 InputStream fis = ClassLoaderUtils.getResourceAsStream(resourceName, PropertiesUtil.class);
 if(fis!=null){
  try {
  prop.load(fis);
  fis.close();// 關(guān)閉流  
  } catch (IOException e) {
  e.printStackTrace();
  }  
  
 }
 if(key==null) return null;
 return prop.getProperty(key);
 }
 
 
 /**
 * 
 * @Description: 根據(jù)key獲取配置的值,若沒有,則取傳過來的默認(rèn)的值
 * @author tianpengw 
 * @param key
 * @param defaultValue 默認(rèn)值
 * @return
 */
 public static String getProperties(String key,String defaultValue){
 if(key==null) return null;
 return prop.getProperty(key, defaultValue);
 
 }
}
配置文件common.properties(放在 src/main/resources下)
#aliyun business licence recognition businessLicenceHost = https://dm-58.data.aliyun.com businessLicencePath = /rest/160601/ocr/ocr_business_license.json appCode = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
三、測(cè)試結(jié)果
成功的結(jié)果:
失敗結(jié)果,當(dāng)處理非營(yíng)業(yè)執(zhí)照的圖片時(shí)將會(huì)返回“invalid business licence”結(jié)果,我這么沒有進(jìn)行判斷處理直接按照正確的json解析,所以報(bào)錯(cuò),此處你們可以按照自己需求選擇處理邏輯。從這返回結(jié)果也看的出該接口做的不合理,返回內(nèi)容不統(tǒng)一,導(dǎo)致接口使用者,必須知曉各種情況才能做有效的處理,如果此處能返回json串,給錯(cuò)誤碼那對(duì)于調(diào)用者來說就方便多了。
四、后記
此API適合一般的營(yíng)業(yè)執(zhí)照和新的三證合一的營(yíng)業(yè)執(zhí)照,但是字段獲取的含義不同,此處需要注意;
由于API并未列出錯(cuò)誤碼,在未知的錯(cuò)誤情況還包含識(shí)別次數(shù)不夠的時(shí)候是報(bào)錯(cuò)還是有錯(cuò)誤提示(由于條件限制,此情況無(wú)法驗(yàn)證);
工具是死的,人是活的,開發(fā)需要考慮盡可能多的情況,來保證代碼的完善。
至此,工具介紹完畢,歡迎交流。
上一篇:沒有了
欄 目:Java編程
下一篇:沒有了
本文標(biāo)題:JAVA演示阿里云圖像識(shí)別API,印刷文字識(shí)別-營(yíng)業(yè)執(zhí)照識(shí)別
本文地址:http://www.jygsgssxh.com/a1/Javabiancheng/8330.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
 - 01-10Java Socket編程(三) 服務(wù)器Sockets
 - 01-10Java進(jìn)階:Struts多模塊的技巧
 - 01-10Java Socket編程(一) Socket傳輸模式
 - 01-10Java Socket編程(二) Java面向連接的類
 - 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
 - 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
 - 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
 - 01-10Java中的浮點(diǎn)數(shù)分析
 - 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類型
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
 - 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
 - 01-10Java Socket編程(三) 服務(wù)器Sockets
 - 01-10Java進(jìn)階:Struts多模塊的技巧
 - 01-10J2SE 1.5版本的新特性一覽
 - 01-10Java Socket編程(一) Socket傳輸模式
 - 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
 - 01-10Java Socket編程(二) Java面向連接的類
 - 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
 - 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
 
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 04-02jquery與jsp,用jquery
 - 01-10delphi制作wav文件的方法
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 


