二維碼生成,打包下載zip,BigDecimal的取值和計算,java發送http請求

      最近工做中用到很多知識點以前常常拿來用,但大都是不求甚解,如今將幾個知識點都一塊兒總結一下與你們分享。java

1、生成二維碼

      公司有業務要批量生成設備二維碼供用戶進行掃碼綁定,遂寫了一個根據所須要攜帶的信息生成二維碼的方法。json

Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MARGIN, 2);

BitMatrix matrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage image = new BufferedImage(width, height + 100, BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.getGraphics();
Graphics2D g2d = (Graphics2D) graphics;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height + 100);
for (int x = 0; x < width; x++) {
  for (int y = 0; y < height; y++) {
  image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
  }
}

g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋體", Font.BOLD, 26));
int left = 25;
int top = 360;
int rowOffset = 35;
String content = "this is content";
g2d.drawString(content, left, top);
g2d.dispose();
image.flush();

ByteArrayOutputStream ost = new ByteArrayOutputStream();
ImageIO.write(image, "png", ost);
複製代碼

      上面是經過content不一樣的內容插入到二維碼之中,生成對應的二維碼圖片。api

2、打包下載ZIP

      生成二維碼以後的業務需求就是在要緊接着將剛纔生成的二維碼們進行批量下載,這時就須要進行打包成ZIP壓縮包。數組

List<String> keys = new ArrayList();
String eachKey;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream out = new ZipOutputStream(baos);
Storage bkt = Storage.bucket("device/keys");//OSS路徑
byte[] data;
for (int i = 0; i < keys.size(); i++) {
  eachKey = keys.get(i);
  //獲取每個文件
  out.putNextEntry(new ZipEntry("key" + eachKey + ".png"));
  out.setEncoding("UTF-8");
  String name = "/model/" + eachKey +".png";
  if (bkt.exist(name)) {
     data = bkt.get(name);
     out.write(data);
  }
  out.closeEntry();
}
out.flush();
out.close();
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
bos.write(baos.toByteArray());
複製代碼

      以上就是先經過ByteArrayOutputStream依次往裏面添加每個OSS上面存在的key的png文件,最後經過response的輸出流將所需文件進行打包返回。服務器

3、BigDecimal的取值和計算

      因爲float和double類型的主要設計目標是爲了科學計算和工程計算,可是在精準的計算結果上表現卻不能達到要求,這時就須要BigDecimal派上用場了。app

一、構造方法

      (1).public BigDecimal(double val)    將double表示形式轉換爲BigDecimal *不建議使用ide

      (2).public BigDecimal(int val)      將int表示形式轉換成BigDecimalpost

      (3).public BigDecimal(String val)  將String表示形式轉換成BigDecimal *建議使用this

二、加減乘除

BigDecimal a = new BigDecimal("4.5");
 BigDecimal b = new BigDecimal("1.5");

 System.out.println("a + b =" + a.add(b));
 System.out.println("a - b =" + a.subtract(b));
 System.out.println("a * b =" + a.multiply(b));
 System.out.println("a / b =" + a.divide(b));
複製代碼

三、取值

      divide(BigDecimal divisor, int scale, int roundingMode) 第一參數表示除數, 第二個參數表示小數點後保留位數, 第三個參數表示舍入模式,只有在做除法運算或四捨五入時纔用到舍入模式,有下面這幾種url

ROUND_CEILING    //向正無窮方向舍入

ROUND_DOWN    //向零方向舍入

ROUND_FLOOR    //向負無窮方向舍入

ROUND_HALF_DOWN    //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,向下舍入, 例如1.55 保留一位小數結果爲1.5

ROUND_HALF_EVEN    //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,若是保留位數是奇數,使用ROUND_HALF_UP,若是是偶數,使用ROUND_HALF_DOWN

ROUND_HALF_UP    //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,向上舍入, 1.55保留一位小數結果爲1.6

ROUND_UNNECESSARY    //計算結果是精確的,不須要舍入模式

ROUND_UP    //向遠離0的方向舍入
複製代碼

四、注意事項

      減乘除其實最終都返回的是一個新的BigDecimal對象,由於BigInteger與BigDecimal都是不可變的(immutable)的,在進行每一步運算時,都會產生一個新的對象。

BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
a.add(b);
System.out.println(a);  //輸出4.5 原來的a不變,加減乘除方法會返回一個新的BigDecimal對象,須要保存計算後的值,
複製代碼

4、Java發起http請求

      由於在一些接口處理過程中須要調用別的接口api獲取的數據,因此須要從java自身發起http請求來獲取數據,通常java原生的HttpURLConnection就已經夠用,以下

一、get請求

HttpURLConnection connection = null;
 InputStream is = null;
 BufferedReader br = null;
 String result = null;// 返回結果字符串
 String urlPath = "";
 try {
      // 建立遠程url鏈接對象
      URL url = new URL(urlPath);
      // 經過遠程url鏈接對象打開一個鏈接,強轉成httpURLConnection類
      connection = (HttpURLConnection) url.openConnection();
      // 設置鏈接方式:get
      connection.setRequestMethod("GET");
      // 設置鏈接主機服務器的超時時間:15000毫秒
      connection.setConnectTimeout(15000);
      // 設置讀取遠程返回的數據時間:60000毫秒
      connection.setReadTimeout(60000);
      // 發送請求
      connection.connect();
      // 經過connection鏈接,獲取輸入流
      if (connection.getResponseCode() == 200) {
          is = connection.getInputStream();
          // 封裝輸入流is,並指定字符集
          br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
          // 存放數據
          StringBuffer sbf = new StringBuffer();
          String temp;
          while ((temp = br.readLine()) != null) {
              sbf.append(temp);
              sbf.append("\r\n");
          }
          result = sbf.toString();
      }
  } catch (MalformedURLException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  } finally {
      // 關閉資源
      if (null != br) {
          try {
              br.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      
      if (null != is) {
          try {
              is.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      connection.disconnect();// 關閉遠程鏈接
  }
複製代碼

二、post請求

HttpURLConnection connection = null;
 InputStream is = null;
 OutputStream os = null;
 BufferedReader br = null;
 String result = null;
 String param = "";
 String uslPath = "";
 try {
      URL url = new URL(uslPath);
      // 經過遠程url鏈接對象打開鏈接
      connection = (HttpURLConnection) url.openConnection();
      // 設置鏈接請求方式
      connection.setRequestMethod("POST");
      // 設置鏈接主機服務器超時時間:15000毫秒
      connection.setConnectTimeout(15000);
      // 設置讀取主機服務器返回數據超時時間:60000毫秒
      connection.setReadTimeout(60000);
       
      // 默認值爲:false,當向遠程服務器傳送數據/寫數據時,須要設置爲true
      connection.setDoOutput(true);
      // 默認值爲:true,當前向遠程服務讀取數據時,設置爲true,該參數無關緊要
      connection.setDoInput(true);
      // 設置通用的請求屬性
      // 若是Content-Type是x-www-form-urlencoded,param則應該是name1=value1&name2=value2格式
      // 若是Content-Type是application/json,param則應該是json格式
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      connection.setRequestProperty("accept", "*/*");
      connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
      // 經過鏈接對象獲取一個輸出流
      os = connection.getOutputStream();
      // 經過輸出流對象將參數寫出去/傳輸出去,它是經過字節數組寫出的
      os.write(param.getBytes());
      // 經過鏈接對象獲取一個輸入流,向遠程讀取
      if (connection.getResponseCode() == 200) {
           is = connection.getInputStream();
           // 對輸入流對象進行包裝:charset根據工做項目組的要求來設置
           br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
           StringBuffer sbf = new StringBuffer();
           String temp = null;
           // 循環遍歷一行一行讀取數據
           while ((temp = br.readLine()) != null) {
               sbf.append(temp);
               sbf.append("\r\n");
           }
           result = sbf.toString();
           }
   } catch (MalformedURLException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   } finally {
       // 關閉資源
       if (null != br) {
           try {
               br.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       if (null != os) {
           try {
               os.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
           if (null != is) {
           try {
               is.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       // 斷開與遠程地址url的鏈接
       connection.disconnect();
   }
複製代碼
相關文章
相關標籤/搜索