這個(gè)問(wèn)題和多態(tài)有著直接關(guān)系,首先封裝兩個(gè)類,貓類和狗類,定義好屬性和值,定義行為,吃,跑,跳等,再新建一個(gè)方法實(shí)現(xiàn)他們,具體多態(tài)只是可以參考下面解釋。
創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),鶴壁網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:鶴壁等地區(qū)。鶴壁做網(wǎng)站價(jià)格咨詢:13518219792
Java的多態(tài)是java要實(shí)現(xiàn)的多種形式
一、實(shí)現(xiàn)多態(tài)的三個(gè)條件(前提條件,向上轉(zhuǎn)型、向下轉(zhuǎn)型)
1、繼承的存在;(繼承是多態(tài)的基礎(chǔ),沒(méi)有繼承就沒(méi)有多態(tài))
2、子類重寫(xiě)父類的方法。(多態(tài)下會(huì)調(diào)用子類重寫(xiě)后的方法)
3、父類引用變量指向子類對(duì)象。(涉及子類到父類的類型轉(zhuǎn)換)
向上轉(zhuǎn)型 Student person = new Student()
將一個(gè)父類的引用指向一個(gè)子類對(duì)象,成為向上轉(zhuǎn)型,自動(dòng)進(jìn)行類型轉(zhuǎn)換。此時(shí)通過(guò)父類引用變量調(diào)用的方法是子類覆蓋或繼承父類的方法,而不是父類的方法此時(shí)通過(guò)父類引用變量無(wú)法調(diào)用子類特有的方法。
向下轉(zhuǎn)型 Student stu = (Student)person;
將一個(gè)指向子類對(duì)象的引用賦給一個(gè)子類的引用,成為向下轉(zhuǎn)型,此時(shí)必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。向下轉(zhuǎn)型必須轉(zhuǎn)換為父類引用指向的真實(shí)子類類型,,否則將出現(xiàn)ClassCastException,不是任意的強(qiáng)制轉(zhuǎn)換
向下轉(zhuǎn)型時(shí)可以結(jié)合使用instanceof運(yùn)算符進(jìn)行強(qiáng)制類型轉(zhuǎn)換,比如出現(xiàn)轉(zhuǎn)換異常---ClassCastException
關(guān)于java的基礎(chǔ)知識(shí)學(xué)習(xí),一定要多看視頻 多看視頻 多看視頻 重要的事情說(shuō)三遍,因?yàn)橐曨l不會(huì)使學(xué)習(xí)變得枯燥,推薦b站上高淇講得還不錯(cuò),可以看看視頻了解一下什么是java中的多態(tài)。
二、多態(tài)(Polymorphism)按字面的意思就是“多種狀態(tài)”。在面向?qū)ο笳Z(yǔ)言中,接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。引用Charlie Calverts對(duì)多態(tài)的描述——多態(tài)性是允許你將父對(duì)象設(shè)置成為一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,
1.把不同的子類對(duì)象都當(dāng)作父類來(lái)看,可以屏蔽不同子類對(duì)象之間的差異,寫(xiě)出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
2.賦值之后,父類型的引用就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。也就是說(shuō),父親的行為像兒子,而不是兒子的行為像父親。
3.比如從某個(gè)基類派生出多個(gè)子類,其基類有一個(gè)虛方法Tdoit,然后其子類也有這個(gè)方法,但行為不同,然后這些子類對(duì)象中的任何一個(gè)可以賦給其基類對(duì)象的引用,或者說(shuō)將子對(duì)象地址賦給基類指針,這樣其基類的對(duì)象就可以執(zhí)行不同的操作了。
4.實(shí)際上你是在通過(guò)其基類的引用來(lái)訪問(wèn)其子類對(duì)象的,你要做的就是一個(gè)賦值操作。
5.使用繼承性的結(jié)果就是當(dāng)創(chuàng)建了一個(gè)類的家族,在認(rèn)識(shí)這個(gè)類的家族時(shí),就是把子類的對(duì)象當(dāng)作基類的對(duì)象,這種認(rèn)識(shí)又叫作upcasting(向上轉(zhuǎn)型)。這樣認(rèn)識(shí)的重要性在于:我們可以只針對(duì)基類寫(xiě)出一段程序,但它可以適應(yīng)于這個(gè)類的家族,
6.因?yàn)榫幾g器會(huì)自動(dòng)找出合適的對(duì)象來(lái)執(zhí)行操作。這種現(xiàn)象又稱為多態(tài)性。而實(shí)現(xiàn)多態(tài)性的手段又叫稱動(dòng)態(tài)綁定(dynamic binding)。
7.父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作(摘自“Delphi4 編程技術(shù)內(nèi)幕”)。簡(jiǎn)單的說(shuō),就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態(tài)性在Object Pascal和C++中都是通過(guò)虛函數(shù)實(shí)現(xiàn)的。
8.多態(tài)指同一個(gè)實(shí)體同時(shí)具有多種形式。它是面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的一個(gè)重要特征。如果一個(gè)語(yǔ)言只支持類而不支持多態(tài),只能說(shuō)明它是基于對(duì)象的,而不是面向?qū)ο蟮摹++中的多態(tài)性具體體現(xiàn)在運(yùn)行和編譯兩個(gè)方面。
9.運(yùn)行時(shí)多態(tài)是動(dòng)態(tài)多態(tài),其具體引用的對(duì)象在運(yùn)行時(shí)才能確定。編譯時(shí)多態(tài)是靜態(tài)多態(tài),在編譯時(shí)就可以確定對(duì)象使用的形式。
10.多態(tài):同一操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過(guò)指向基類的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類中的方法。
C++中,實(shí)現(xiàn)多態(tài)有以下方法:虛函數(shù),抽象類,覆蓋,模板(重載和多態(tài)無(wú)關(guān))。
OC中的多態(tài):不同對(duì)象對(duì)同一消息的不同響應(yīng).子類可以重寫(xiě)父類的方法
多態(tài)就是允許方法重名 參數(shù)或返回值可以是父類型傳入或返回。
可以用main函數(shù)和JUnit來(lái)寫(xiě)測(cè)試代碼。main是最早使用的,但是現(xiàn)在更流行的測(cè)試工具是JUnit。
JUnit是一個(gè)Java語(yǔ)言的單元測(cè)試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源于Kent Beck的sUnit的xUnit家族中最為成功的一個(gè)。 JUnit有它自己的JUnit擴(kuò)展生態(tài)圈。多數(shù)Java的開(kāi)發(fā)環(huán)境都已經(jīng)集成了JUnit作為單元測(cè)試的工具。
下面是一些具體的編寫(xiě)測(cè)試代碼的技巧或較好的實(shí)踐方法:
1. 不要用TestCase的構(gòu)造函數(shù)初始化Fixture,而要用setUp()和tearDown()方法。
2. 不要依賴或假定測(cè)試運(yùn)行的順序,因?yàn)镴Unit利用Vector保存測(cè)試方法。所以不同的平臺(tái)會(huì)按不同的順序從Vector中取出測(cè)試方法。
3. 避免編寫(xiě)有副作用的TestCase。例如:如果隨后的測(cè)試依賴于某些特定的交易數(shù)據(jù),就不要提交交易數(shù)據(jù)。簡(jiǎn)單的回滾就可以了。
4. 當(dāng)繼承一個(gè)測(cè)試類時(shí),記得調(diào)用父類的setUp()和tearDown()方法。
5. 將測(cè)試代碼和工作代碼放在一起,一邊同步編譯和更新。(使用Ant中有支持junit的task.)
6. 測(cè)試類和測(cè)試方法應(yīng)該有一致的命名方案。如在工作類名前加上test從而形成測(cè)試類名。
7. 確保測(cè)試與時(shí)間無(wú)關(guān),不要依賴使用過(guò)期的數(shù)據(jù)進(jìn)行測(cè)試。導(dǎo)致在隨后的維護(hù)過(guò)程中很難重現(xiàn)測(cè)試。
8. 如果你編寫(xiě)的軟件面向國(guó)際市場(chǎng),編寫(xiě)測(cè)試時(shí)要考慮國(guó)際化的因素。不要僅用母語(yǔ)的Locale進(jìn)行測(cè)試。
9. 盡可能地利用JUnit提供地assert/fail方法以及異常處理的方法,可以使代碼更為簡(jiǎn)潔。
10.測(cè)試要盡可能地小,執(zhí)行速度快。
11.不要硬性規(guī)定數(shù)據(jù)文件的路徑。
12.利用Junit 的自動(dòng)異常處理書(shū)寫(xiě)簡(jiǎn)潔的測(cè)試代碼
事實(shí)上在Junit 中使用try-catch 來(lái)捕獲異常是沒(méi)有必要的,Junit 會(huì)自動(dòng)捕獲異常。那些沒(méi)有被捕獲的異常就被當(dāng)成錯(cuò)誤處理。
13. 充分利用Junit 的assert/fail 方法
assertSame()用來(lái)測(cè)試兩個(gè)引用是否指向同一個(gè)對(duì)象
assertEquals()用來(lái)測(cè)試兩個(gè)對(duì)象是否相等
14. 確保測(cè)試代碼與時(shí)間無(wú)關(guān)
15. 使用文檔生成器做測(cè)試文檔。
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle(){
System.out.println("k = " +k);
System.out.println("j = " + j);
}
private static int x2 = printInit("static Beetle.x2 initialized");
public static void main(String[] args){
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}
java中主要使用charset這個(gè)類來(lái)判斷文件的編碼格式,代碼如下:
package?com.ghj.packageoftool;
import?info.monitorenter.cpdetector.io.ASCIIDetector;
import?info.monitorenter.cpdetector.io.ByteOrderMarkDetector;
import?info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import?info.monitorenter.cpdetector.io.JChardetFacade;
import?info.monitorenter.cpdetector.io.ParsingDetector;
import?info.monitorenter.cpdetector.io.UnicodeDetector;
import?java.io.ByteArrayInputStream;
import?java.io.File;
import?java.io.InputStream;
import?java.net.URL;
import?java.nio.charset.Charset;
/**
*?文件工具類
*?
*?@author?高煥杰
*/
public?class?FileTool?{
/**
*?獲取本地文件的編碼格式
*?
*?@param?file?要判斷的文件編碼格式
*?
*?@author?高煥杰
*/
public?static?String?getLocalFileEncode(File?localFile)?{
/*
*?cpDetector是探測(cè)器,它把探測(cè)任務(wù)交給具體的探測(cè)實(shí)現(xiàn)類的實(shí)例完成。
*?cpDetector內(nèi)置了一些常用的探測(cè)實(shí)現(xiàn)類,這些探測(cè)實(shí)現(xiàn)類的實(shí)例可以通過(guò)add方法?加進(jìn)來(lái),如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰(shuí)最先返回非空的探測(cè)結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測(cè)到的字符集編碼。cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測(cè)過(guò)程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測(cè)定。所以,一般有了這個(gè)探測(cè)器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心,可以再多加幾個(gè)探測(cè)器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(new?ByteOrderMarkDetector());??
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測(cè)定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測(cè)定
Charset?charset?=?null;
try?{
charset?=?codepageDetector.detectCodepage(localFile.toURI().toURL());
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?獲得遠(yuǎn)程URL文件的編碼格式
*?
*?@param?url?遠(yuǎn)程文件的URL路徑
*?
*?@author?高煥杰
*/
public?static?String?getURLFileEncode(URL?url)?{
/*
*?cpDetector是探測(cè)器,它把探測(cè)任務(wù)交給具體的探測(cè)實(shí)現(xiàn)類的實(shí)例完成。
*?cpDetector內(nèi)置了一些常用的探測(cè)實(shí)現(xiàn)類,這些探測(cè)實(shí)現(xiàn)類的實(shí)例可以通過(guò)add方法?加進(jìn)來(lái),如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰(shuí)最先返回非空的探測(cè)結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測(cè)到的字符集編碼。cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測(cè)過(guò)程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測(cè)定。所以,一般有了這個(gè)探測(cè)器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心,可以再多加幾個(gè)探測(cè)器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測(cè)定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測(cè)定
Charset?charset?=?null;
try?{
charset?=?codepageDetector.detectCodepage(url);
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?獲得文件流的編碼格式
*?
*?@param?inputStream?文件流
*?
*?@author?高煥杰
*/
public?static?String?getInputStreamEncode(InputStream?inputStream)?{
/*
*?cpDetector是探測(cè)器,它把探測(cè)任務(wù)交給具體的探測(cè)實(shí)現(xiàn)類的實(shí)例完成。
*?cpDetector內(nèi)置了一些常用的探測(cè)實(shí)現(xiàn)類,這些探測(cè)實(shí)現(xiàn)類的實(shí)例可以通過(guò)add方法?加進(jìn)來(lái),如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰(shuí)最先返回非空的探測(cè)結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測(cè)到的字符集編碼。cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測(cè)過(guò)程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測(cè)定。所以,一般有了這個(gè)探測(cè)器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心,可以再多加幾個(gè)探測(cè)器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測(cè)定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測(cè)定
Charset?charset?=?null;
try?{
charset?=?codepageDetector.detectCodepage(inputStream,?0);
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?獲得字符串的編碼格式
*?
*?@param?stringValue?要判斷的文件編碼格式字符串
*?
*?@author?高煥杰
*/
public?static?String?getStringEncode(String?stringValue)?{
/*
*?cpDetector是探測(cè)器,它把探測(cè)任務(wù)交給具體的探測(cè)實(shí)現(xiàn)類的實(shí)例完成。
*?cpDetector內(nèi)置了一些常用的探測(cè)實(shí)現(xiàn)類,這些探測(cè)實(shí)現(xiàn)類的實(shí)例可以通過(guò)add方法?加進(jìn)來(lái),如ParsingDetector、ByteOrderMarkDetector、JChardetFacade、ASCIIDetector、UnicodeDetector。
*?cpDetector按照“誰(shuí)最先返回非空的探測(cè)結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測(cè)到的字符集編碼。cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確。
*/
CodepageDetectorProxy?codepageDetector?=?CodepageDetectorProxy.getInstance();
codepageDetector.add(new?ParsingDetector(false));//ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于指示是否顯示探測(cè)過(guò)程的詳細(xì)信息,為false不顯示。
codepageDetector.add(JChardetFacade.getInstance());//JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼?測(cè)定。所以,一般有了這個(gè)探測(cè)器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心,可以再多加幾個(gè)探測(cè)器,比如下面的ASCIIDetector、UnicodeDetector等。
codepageDetector.add(ASCIIDetector.getInstance());//ASCIIDetector用于ASCII編碼測(cè)定
codepageDetector.add(UnicodeDetector.getInstance());//UnicodeDetector用于Unicode家族編碼的測(cè)定
Charset?charset?=?null;
try?{
InputStream?inputStream?=?new?ByteArrayInputStream(stringValue.getBytes());
charset?=?codepageDetector.detectCodepage(inputStream,?3);
if?(charset?!=?null){
return?charset.name();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
}
java課程設(shè)計(jì)例子
Java如何獲取文件編碼格式
1:簡(jiǎn)單判斷是UTF-8或不是UTF-8,因?yàn)橐话愠薝TF-8之外就是GBK,所以就設(shè)置默認(rèn)為GBK。
按照給定的字符集存儲(chǔ)文件時(shí),在文件的最開(kāi)頭的三個(gè)字節(jié)中就有可能存儲(chǔ)著編碼信息,所以,基本的原理就是只要讀出文件前三個(gè)字節(jié),判定這些字節(jié)的值,就可以得知其編碼的格式。其實(shí),如果項(xiàng)目運(yùn)行的平臺(tái)就是中文操作系統(tǒng),如果這些文本文件在項(xiàng)目?jī)?nèi)產(chǎn)生,即開(kāi)發(fā)人員可以控制文本的編碼格式,只要判定兩種常見(jiàn)的編碼就可以了:GBK和UTF-8。由于中文Windows默認(rèn)的編碼是GBK,所以一般只要判定UTF-8編碼格式。
對(duì)于UTF-8編碼格式的文本文件,其前3個(gè)字節(jié)的值就是-17、-69、-65,所以,判定是否是UTF-8編碼格式的代碼片段如下:
File?file?=?new?File(path);
InputStream?in=?new?java.io.FileInputStream(file);
byte[]?b?=?new?byte[3];
in.read(b);
in.close();
if?(b[0]?==?-17??b[1]?==?-69??b[2]?==?-65)
System.out.println(file.getName()?+?":編碼為UTF-8");
else
System.out.println(file.getName()?+?":可能是GBK,也可能是其他編碼");
2:若想實(shí)現(xiàn)更復(fù)雜的文件編碼檢測(cè),可以使用一個(gè)開(kāi)源項(xiàng)目cpdetector,它所在的網(wǎng)址是:。它的類庫(kù)很小,只有500K左右,cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確,利用該類庫(kù)判定文本文件的代碼如下:
讀外部文件(先利用cpdetector檢測(cè)文件的編碼格式,然后用檢測(cè)到的編碼方式去讀文件):
/**
?*?利用第三方開(kāi)源包c(diǎn)pdetector獲取文件編碼格式
?*?
?*?@param?path
?*????????????要判斷文件編碼格式的源文件的路徑
?*?@author?huanglei
?*?@version?2012-7-12?14:05
?*/
public?static?String?getFileEncode(String?path)?{
/*
?*?detector是探測(cè)器,它把探測(cè)任務(wù)交給具體的探測(cè)實(shí)現(xiàn)類的實(shí)例完成。
?*?cpDetector內(nèi)置了一些常用的探測(cè)實(shí)現(xiàn)類,這些探測(cè)實(shí)現(xiàn)類的實(shí)例可以通過(guò)add方法?加進(jìn)來(lái),如ParsingDetector、
?*?JChardetFacade、ASCIIDetector、UnicodeDetector。
?*?detector按照“誰(shuí)最先返回非空的探測(cè)結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測(cè)到的
?*?字符集編碼。使用需要用到三個(gè)第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
?*?cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確。
?*/
CodepageDetectorProxy?detector?=?CodepageDetectorProxy.getInstance();
/*
?*?ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于
?*?指示是否顯示探測(cè)過(guò)程的詳細(xì)信息,為false不顯示。
?*/
detector.add(new?ParsingDetector(false));
/*
?*?JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼
?*?測(cè)定。所以,一般有了這個(gè)探測(cè)器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心,可以
?*?再多加幾個(gè)探測(cè)器,比如下面的ASCIIDetector、UnicodeDetector等。
?*/
detector.add(JChardetFacade.getInstance());//?用到antlr.jar、chardet.jar
//?ASCIIDetector用于ASCII編碼測(cè)定
detector.add(ASCIIDetector.getInstance());
//?UnicodeDetector用于Unicode家族編碼的測(cè)定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset?charset?=?null;
File?f?=?new?File(path);
try?{
charset?=?detector.detectCodepage(f.toURI().toURL());
}?catch?(Exception?ex)?{
ex.printStackTrace();
}
if?(charset?!=?null)
return?charset.name();
else
return?null;
}
String?charsetName?=?getFileEncode(configFilePath);
System.out.println(charsetName);
inputStream?=?new?FileInputStream(configFile);
BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(inputStream,?charsetName));
讀jar包內(nèi)部資源文件(先利用cpdetector檢測(cè)jar內(nèi)部的資源文件的編碼格式,然后以檢測(cè)到的編碼方式去讀文件):
/**
?*?利用第三方開(kāi)源包c(diǎn)pdetector獲取URL對(duì)應(yīng)的文件編碼
?*?
?*?@param?path
?*????????????要判斷文件編碼格式的源文件的URL
?*?@author?huanglei
?*?@version?2012-7-12?14:05
?*/
public?static?String?getFileEncode(URL?url)?{
/*
?*?detector是探測(cè)器,它把探測(cè)任務(wù)交給具體的探測(cè)實(shí)現(xiàn)類的實(shí)例完成。
?*?cpDetector內(nèi)置了一些常用的探測(cè)實(shí)現(xiàn)類,這些探測(cè)實(shí)現(xiàn)類的實(shí)例可以通過(guò)add方法?加進(jìn)來(lái),如ParsingDetector、
?*?JChardetFacade、ASCIIDetector、UnicodeDetector。
?*?detector按照“誰(shuí)最先返回非空的探測(cè)結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測(cè)到的
?*?字符集編碼。使用需要用到三個(gè)第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
?*?cpDetector是基于統(tǒng)計(jì)學(xué)原理的,不保證完全正確。
?*/
CodepageDetectorProxy?detector?=?CodepageDetectorProxy.getInstance();
/*
?*?ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于
?*?指示是否顯示探測(cè)過(guò)程的詳細(xì)信息,為false不顯示。
?*/
detector.add(new?ParsingDetector(false));
/*
?*?JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼
?*?測(cè)定。所以,一般有了這個(gè)探測(cè)器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心,可以
?*?再多加幾個(gè)探測(cè)器,比如下面的ASCIIDetector、UnicodeDetector等。
?*/
detector.add(JChardetFacade.getInstance());//?用到antlr.jar、chardet.jar
//?ASCIIDetector用于ASCII編碼測(cè)定
detector.add(ASCIIDetector.getInstance());
//?UnicodeDetector用于Unicode家族編碼的測(cè)定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset?charset?=?null;
try?{
charset?=?detector.detectCodepage(url);
}?catch?(Exception?ex)?{
ex.printStackTrace();
}
if?(charset?!=?null)
return?charset.name();
else
return?null;
}
URL?url?=?CreateStationTreeModel.class.getResource("/resource/"?+?"配置文件");
URLConnection?urlConnection?=?url.openConnection();
inputStream=urlConnection.getInputStream();
String?charsetName?=?getFileEncode(url);
System.out.println(charsetName);
BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(inputStream,?charsetName));
3:探測(cè)任意輸入的文本流的編碼,方法是調(diào)用其重載形式:?
charset=detector.detectCodepage(待測(cè)的文本輸入流,測(cè)量該流所需的讀入字節(jié)數(shù));?
上面的字節(jié)數(shù)由程序員指定,字節(jié)數(shù)越多,判定越準(zhǔn)確,當(dāng)然時(shí)間也花得越長(zhǎng)。要注意,字節(jié)數(shù)的指定不能超過(guò)文本流的最大長(zhǎng)度。
4:判定文件編碼的具體應(yīng)用舉例:
屬性文件(.properties)是Java程序中的常用文本存儲(chǔ)方式,象STRUTS框架就是利用屬性文件存儲(chǔ)程序中的字符串資源。它的內(nèi)容如下所示:
#注釋語(yǔ)句
屬性名=屬性值
讀入屬性文件的一般方法是:
FileInputStream?ios=new?FileInputStream(“屬性文件名”);
Properties?prop=new?Properties();
prop.load(ios);
String?value=prop.getProperty(“屬性名”);
ios.close();
利用java.io.Properties的load方法讀入屬性文件雖然方便,但如果屬性文件中有中文,在讀入之后就會(huì)發(fā)現(xiàn)出現(xiàn)亂碼現(xiàn)象。發(fā)生這個(gè)原因是load方法使用字節(jié)流讀入文本,在讀入后需要將字節(jié)流編碼成為字符串,而它使用的編碼是“iso-8859-1”,這個(gè)字符集是ASCII碼字符集,不支持中文編碼,
方法一:使用顯式的轉(zhuǎn)碼:
String?value=prop.getProperty(“屬性名”);
String?encValue=new?String(value.getBytes(“iso-8859-1″),”屬性文件的實(shí)際編碼”);
方法二:象這種屬性文件是項(xiàng)目?jī)?nèi)部的,我們可以控制屬性文件的編碼格式,比如約定采用Windows內(nèi)定的GBK,就直接利用”gbk”來(lái)轉(zhuǎn)碼,?????如果約定采用UTF-8,就使用”UTF-8″直接轉(zhuǎn)碼。
方法三:如果想靈活一些,做到自動(dòng)探測(cè)編碼,就可利用上面介紹的方法測(cè)定屬性文件的編碼,從而方便開(kāi)發(fā)人員的工作
補(bǔ)充:可以用下面代碼獲得Java支持編碼集合:
Charset.availableCharsets().keySet();
可以用下面的代碼獲得系統(tǒng)默認(rèn)編碼:
Charset.defaultCharset();
public class Family {
private int money;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String doorplate;
protected void secret() {
System.out.println("----Family.secret()");
}
private void vehicle(){
System.out.println("----Family.vehicle()");
}
}
package china.beijing;
import china.hb.hd.Family;
public class SubFamily extends Family{
/**
* @param args
*/
public static void main(String[] args) {
Family f = new Family();
f.doorplate = "2000";//public,直接訪問(wèn)
f.setMoney(100);//私有變量,只能通過(guò)set方法設(shè)置值
System.out.println(f.getMoney());
}
}
分享標(biāo)題:Java家族代碼,java代碼類
分享網(wǎng)址:http://jinyejixie.com/article38/dsedhsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷、用戶體驗(yàn)、品牌網(wǎng)站建設(shè)、虛擬主機(jī)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)