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