成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java中String和byte數(shù)組轉(zhuǎn)換的小技巧

CastlePeaK / 1795人閱讀

摘要:今日看公司代碼時(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

相關(guān)文章

  • 1、轉(zhuǎn)換流 2、緩沖流

    摘要:字符轉(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é)流的橋梁:可使用指定的字符編碼...

    sf190404 評(píng)論0 收藏0
  • String類(lèi)基礎(chǔ)的那些事!

    摘要:第三階段常見(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è)字符串...

    30e8336b8229 評(píng)論0 收藏0
  • underscore的小技巧

    摘要:在閱讀的過(guò)程中,發(fā)現(xiàn)了它的一些小技巧,對(duì)我們平時(shí)的編程很有用。事實(shí)上,在上也的確是可以被更改的而在或高版本的中,并不能更改全局的。但是,局部的仍然可以被改變。所以,建議在已知長(zhǎng)度的情況下,使用第一種,而不知道長(zhǎng)度的情況下,使用第二種。 在閱讀 underscore 的過(guò)程中,發(fā)現(xiàn)了它的一些小技巧,對(duì)我們平時(shí)的編程很有用。在這里向大家介紹一二 void 0 代替 underfined 首...

    lifesimple 評(píng)論0 收藏0
  • JS 經(jīng)常使用的小技巧,助你更簡(jiǎn)短的實(shí)現(xiàn)一些功能

    摘要:第二個(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...

    ChristmasBoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<