摘要:用于統(tǒng)一編碼格式。由于和內(nèi)置的遵守的協(xié)議不一致,按照照實(shí)現(xiàn)的,是按照和兩個(gè)協(xié)議來實(shí)現(xiàn)的。由于協(xié)議的不同可能導(dǎo)致的解碼編碼的數(shù)據(jù)時(shí)拋出異常因此需要特別注意保持解碼編碼的一致性。
jdk1.8 base64的編碼轉(zhuǎn)碼 實(shí)用場景
最近工作上有個(gè)需求,需要根據(jù)圖片的url下載到本地,并且客戶端無法訪問到url只能接收base64圖片碼。因此決定采用jdk自帶的Base64進(jìn)行編碼轉(zhuǎn)碼存儲(chǔ)。
小插曲采用了兩個(gè)工具類:ImageUtil和Base64Util。ImageUtil用于實(shí)際操作。Base64Util用于統(tǒng)一編碼格式。
由于jdk1.7和jdk1.8內(nèi)置的Base64遵守的RFC協(xié)議不一致,jdk1.7按照照RFC1521實(shí)現(xiàn)的,jdk1.8是按照rfc4648和rfc2045兩個(gè)協(xié)議來實(shí)現(xiàn)的。具體可以從類注釋中查詢到。由于協(xié)議的不同可能導(dǎo)致jdk1.8的解碼jdk1.7編碼的數(shù)據(jù)時(shí)拋出java.lang.IllegalArgumentException: Illegal base64 character a異常.因此需要特別注意保持解碼編碼的一致性。jdk7的編碼結(jié)果包含換行;
jdk8的編碼結(jié)果不包含換行;
jdk8無法解碼包含換行的編碼結(jié)果;
既然得知上述異常產(chǎn)生的由于,故找到解決方案也很簡單。
使用apache common包中的org.apache.commons.codec.binary.Base64類進(jìn)行編碼和解碼;
編碼之后或解碼之前去除換行符;
編碼和解碼使用相同的jdk版本;
附上代碼ImageUtils
import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class ImageUtils { /** * base64轉(zhuǎn)文件地址 * * @param filePath * @param base64 * @param fileName */ public static void base64ToImg(String filePath, String base64, String fileName) { File file = null; //創(chuàng)建文件目錄 File dir = new File(filePath); if (!dir.exists() && !dir.isDirectory()) { dir.mkdirs(); } BufferedOutputStream bos = null; java.io.FileOutputStream fos = null; try { byte[] bytes = Base64Util.decode(base64); file = new File(filePath + fileName); fos = new java.io.FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(bytes); } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 通過Toolkit獲取base64 * * @param url * @return * @author caoting * @date 2018年11月21日 */ public static String getBase64ByImgUrl(String url) { String suffix = url.substring(url.lastIndexOf(".") + 1); try { URL urls = new URL(url); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Image image = Toolkit.getDefaultToolkit().getImage(urls); BufferedImage biOut = toBufferedImage(image); ImageIO.write(biOut, suffix, baos); String base64Str = Base64Util.encode(baos.toByteArray()); return base64Str; } catch (Exception e) { return ""; } } public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage) image; } // This code ensures that all the pixels in the image are loaded image = new ImageIcon(image).getImage(); BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { int transparency = Transparency.OPAQUE; GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency); } catch (HeadlessException e) { // The system does not have a screen } if (bimage == null) { // Create a buffered image using the default color model int type = BufferedImage.TYPE_INT_RGB; bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); } // Copy image to buffered image Graphics g = bimage.createGraphics(); // Paint the image onto the buffered image g.drawImage(image, 0, 0, null); g.dispose(); return bimage; } /** * 通過下載二進(jìn)制流的方式獲取base64 * * @param imgUrl 圖片url * @return 返回圖片base64的字符串 */ public static String image2Base64(String imgUrl) { URL url = null; InputStream is = null; ByteArrayOutputStream outStream = null; HttpURLConnection httpUrl = null; try { url = new URL(imgUrl); httpUrl = (HttpURLConnection) url.openConnection(); httpUrl.connect(); httpUrl.getInputStream(); is = httpUrl.getInputStream(); outStream = new ByteArrayOutputStream(); // 創(chuàng)建一個(gè)Buffer字符串 byte[] buffer = new byte[1024]; // 每次讀取的字符串長度,如果為-1,代表全部讀取完畢 int len = 0; // 使用一個(gè)輸入流從buffer里把數(shù)據(jù)讀取出來 while ((len = is.read(buffer)) != -1) { // 用輸出流往buffer里寫入數(shù)據(jù),中間參數(shù)代表從哪個(gè)位置開始讀,len代表讀取的長度 outStream.write(buffer, 0, len); } // 對(duì)字節(jié)數(shù)組Base64編碼 return Base64Util.encode(outStream.toByteArray()); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (outStream != null) { try { outStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (httpUrl != null) { httpUrl.disconnect(); } } return imgUrl; } }
Base64Util
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.imageio.stream.FileImageInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Base64Util{ /** * 字符串轉(zhuǎn)圖片 * @param base64Str * @return */ public static byte[] decode(String base64Str){ byte[] b = null; BASE64Decoder decoder = new BASE64Decoder(); try { b = decoder.decodeBuffer(replaceEnter(base64Str)); } catch (IOException e) { e.printStackTrace(); } return b; } /** * 圖片轉(zhuǎn)字符串 * @param image * @return */ public static String encode(byte[] image){ BASE64Encoder decoder = new BASE64Encoder(); return replaceEnter(decoder.encode(image)); } public static String encode(String uri){ BASE64Encoder encoder = new BASE64Encoder(); return replaceEnter(encoder.encode(uri.getBytes())); } /** * * @path 圖片路徑 * @return */ public static byte[] imageTobyte(String path){ byte[] data = null; FileImageInputStream input = null; try { input = new FileImageInputStream(new File(path)); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int numBytesRead = 0; while((numBytesRead = input.read(buf)) != -1){ output.write(buf, 0, numBytesRead); } data = output.toByteArray(); output.close(); input.close(); } catch (Exception e) { e.printStackTrace(); } return data; } public static String replaceEnter(String str){ String reg ="[ - ]"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); return m.replaceAll(""); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74033.html
摘要:對(duì)于不同的實(shí)現(xiàn),對(duì)象占用的內(nèi)存空間大小可能不盡相同,本文主要分析中的情況,實(shí)驗(yàn)環(huán)境為位系統(tǒng),使用進(jìn)行結(jié)論驗(yàn)證。內(nèi)存占用這里分析一個(gè)只有一組鍵值對(duì)的結(jié)構(gòu)如下首先分析本身的大小。 本文深入分析并驗(yàn)證了不同Java對(duì)象占用內(nèi)存空間大小的情況。對(duì)于不同的jvm實(shí)現(xiàn),Java對(duì)象占用的內(nèi)存空間大小可能不盡相同,本文主要分析HotSpot jvm中的情況,實(shí)驗(yàn)環(huán)境為64位window10系統(tǒng)、JD...
摘要:更多相關(guān)請(qǐng)來這最近剛買了,準(zhǔn)備把自己做的項(xiàng)目放上來,順便學(xué)學(xué),花了一天時(shí)間把環(huán)境搭建了起來,以命令的方式把步驟記錄下來系統(tǒng)環(huán)境及工具操作系統(tǒng)工具安裝步驟及命令先創(chuàng)建一個(gè)文件夾,通過把需要的軟件放進(jìn)去安裝修改環(huán)境變量如下安裝需要 更多VPS相關(guān)請(qǐng)來這:https://javamethod.com/bwg 最近剛買了VPS,準(zhǔn)備把自己做的項(xiàng)目放上來,順便學(xué)學(xué)Linux、VPS,花了一天時(shí)間...
摘要:在并發(fā)量較低的環(huán)境下,線程沖突的概率比較小,自旋的次數(shù)不會(huì)很多。比如有三個(gè),每個(gè)線程對(duì)增加。的核心方法還是通過例子來看假設(shè)現(xiàn)在有一個(gè)對(duì)象,四個(gè)線程同時(shí)對(duì)進(jìn)行累加操作。 showImg(https://segmentfault.com/img/remote/1460000016012084); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... ...
閱讀 1974·2021-09-04 16:45
閱讀 764·2019-08-30 15:44
閱讀 905·2019-08-30 13:07
閱讀 468·2019-08-29 16:06
閱讀 1391·2019-08-29 13:43
閱讀 1286·2019-08-26 17:00
閱讀 1534·2019-08-26 13:51
閱讀 2305·2019-08-26 11:48