摘要:今日看公司代碼時發現,在和數組轉換的過程中,大量的無聊。所以寫了本文,作一個基本編程知識的小科普。分享一個編程的小技巧,簡單實用。而最要命的是,是繼承自類。
今日看公司代碼時發現,在string和byte數組轉換的過程中,大量的無聊try catch。所以寫了本文,作一個java基本編程知識的小科普。
分享一個java編程的小技巧,簡單實用。
建議
其實內容就一句話:
在做String和byte[]的相互轉換時,請使用StandardCharsets.UTF_8來替代”utf-8”
解釋一下,通常我們代碼是這樣寫:
String string = new String(bytes, "utf-8"); byte[] bytes = string.getBytes("utf-8");
請換成下面這個寫法:
String string = new String(bytes, StandardCharsets.UTF_8); byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
注: 其實大家看到這里就可以打住了
問題解釋
第一個寫法功能當然沒問題,但是代碼寫完之后,IDE一定會立刻提醒你,這里會拋出UnsupportedEncodingException。
而最要命的是,UnsupportedEncodingException是繼承自類Exceptio。
這是一個checked exception, 這是一個checked exception, 這是一個checked exception!
JDK的源代碼如下:
public String(byte bytes[], String charsetName) throws UnsupportedEncodingException { this(bytes, 0, bytes.length, charsetName); }
這意味著我們要不加上try catch,要不就要在方法上顯示申明要拋出異常。
而申明拋出UnsupportedEncodingException異常絕對不是一個好注意,鬼都知道這里這個UTF-8一定不會
unsupported,把這個麻煩扔給調用者絕對是一個不負責任的行為。
所以我在代碼中看到大量的類似代碼:
try { String json = new String(data, "utf-8"); // 此處略去××字 } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
解決方法
這個問題由來已久,java社區解決這個問題的方式也很早就有,沒有記錯的話 apache commons大概十年前就提供了
方案,注意jdk中提供的另外一個不拋UnsupportedEncodingException的構造函數:
public String(byte bytes[], Charset charset) { this(bytes, 0, bytes.length, charset); }
和前一個構造函數的差別就是這里直接輸入了Charset對象,不需要做一次從string到Charset
的轉化(這里才是UnsupportedEncodingException拋出的根源)。而我們日常要用到的charset是非常
有限的,因此只要簡單列常來最常用的幾個就好了。
JDK7之后,java引入了java.nio.charset.StandardCharsets來做charset預定義:
public final class StandardCharsets { public static final Charset US_ASCII = Charset.forName("US-ASCII"); public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); public static final Charset UTF_8 = Charset.forName("UTF-8"); ...... }
在jdk之前,很多基本類庫都提供類似的功能,比如大家熟悉的apache commons,這個是最早提供也是用的最多的的:
org.apache.commons.codec.Charsets /** * @see Standard charsets * @deprecated Use Java 7"s {@link java.nio.charset.StandardCharsets} */ @Deprecated public static final Charset UTF_8 = Charset.forName(CharEncoding.UTF_8);
注意上面的注釋,現在apache已經Deprecated 它了,建議大家用StandardCharsets。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69329.html
摘要:字符轉換流原理字節流編碼表。和作為子類,僅作為操作字符文件的便捷類存在。源目的先根據需求明確要讀,還是要寫。屏幕網絡完全可以明確具體要使用哪個流對象。明確四是否需要額外功能呢額外功能轉換嗎轉換流。高效嗎緩沖區對象。 01轉換流概述 * A: 轉換流概述 * a: 轉換流概述 * OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的字符編碼...
摘要:第三階段常見對象的學習第一章常見對象類一類的概述及其構造方法概述多個字符組成的一串數據,例如也可以看成是一個字符數組。 第三階段 JAVA常見對象的學習 第一章 常見對象——String類 (一) String 類的概述及其構造方法 (1) 概述 多個字符組成的一串數據,例如 abc 也可以看成是一個字符數組。 而通過 API我們又可以知道 A:字符串字面值abc也可以看成是一個字符串...
摘要:在閱讀的過程中,發現了它的一些小技巧,對我們平時的編程很有用。事實上,在上也的確是可以被更改的而在或高版本的中,并不能更改全局的。但是,局部的仍然可以被改變。所以,建議在已知長度的情況下,使用第一種,而不知道長度的情況下,使用第二種。 在閱讀 underscore 的過程中,發現了它的一些小技巧,對我們平時的編程很有用。在這里向大家介紹一二 void 0 代替 underfined 首...
摘要:第二個問題非基礎類型則不好處理,其實像這種比較的方法,往往不是用于處理普遍情況的,往往是在特殊場景發揮奇效的。沒有最好的方案,只有最合適的方案。這樣才能使得正數和負數的表示統一起來,具體可以參閱補碼的歷史,這里不過多展開了。 原文: https://github.com/HCThink/h-... github 首頁(star+watch,一手動態直達): https://gith...
閱讀 1487·2021-11-24 11:16
閱讀 2690·2021-07-28 12:32
閱讀 2302·2019-08-30 11:22
閱讀 1440·2019-08-30 11:01
閱讀 595·2019-08-29 16:24
閱讀 3547·2019-08-29 12:52
閱讀 1625·2019-08-29 12:15
閱讀 1332·2019-08-29 11:18