數(shù)據(jù)及數(shù)據(jù)流的處理_第1頁
數(shù)據(jù)及數(shù)據(jù)流的處理_第2頁
數(shù)據(jù)及數(shù)據(jù)流的處理_第3頁
數(shù)據(jù)及數(shù)據(jù)流的處理_第4頁
數(shù)據(jù)及數(shù)據(jù)流的處理_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)及數(shù)據(jù)流的處理目錄1.數(shù)據(jù)及計(jì)算機(jī)存儲(chǔ)2.進(jìn)制數(shù)3.運(yùn)算符4.字節(jié)、字符5.數(shù)據(jù)流的處理6.數(shù)據(jù)類型轉(zhuǎn)換1數(shù)據(jù)什么是數(shù)據(jù)?

在計(jì)算機(jī)系統(tǒng)中,各種字母、數(shù)字符號(hào)的組合、語音、圖形、圖像等統(tǒng)稱為數(shù)據(jù),數(shù)據(jù)經(jīng)過加工后就成為信息。

在計(jì)算機(jī)科學(xué)中,數(shù)據(jù)是指所有能輸入到計(jì)算機(jī)并被計(jì)算機(jī)程序處理的符號(hào)的介質(zhì)的總稱,是用于輸入電子計(jì)算機(jī)進(jìn)行處理,具有一定意義的數(shù)字、字母、符號(hào)和模擬量等的通稱。2計(jì)算機(jī)存儲(chǔ)問題一:為什么自己家里的寬帶ADSL是1Mb的帶寬,但是下載數(shù)據(jù)卻只能在100KB左右徘徊?問題二:計(jì)算機(jī)中顯示出來的容量往往比硬盤容量的標(biāo)稱值要小?3一、

一般來說,我們講到存儲(chǔ)設(shè)備時(shí),都是按照字節(jié)進(jìn)行換算,例如1GB=1024MB=1024*1024KB。但是在網(wǎng)絡(luò)傳輸之中,數(shù)據(jù)傳輸則是按照位進(jìn)行傳輸?shù)摹?/p>

因?yàn)?Mb=1024Kb,由于字節(jié)與位之間的關(guān)系是八倍,因此將1024Kb除以8就得到128KB。由此可見,實(shí)現(xiàn)上網(wǎng)絡(luò)傳輸帶寬中的1M只等于電腦中的128KB。這樣加上信號(hào)的衰減,一般只能保持在100KB左右。二、這是由于不同的單位轉(zhuǎn)換關(guān)系造成的。我們知道,在計(jì)算機(jī)中1GB=1024MB,而硬盤廠家通常是按照1GB=1000MB進(jìn)行換算的。以120GB的硬盤為例:廠商容量計(jì)算方法:120GB=120,000MB=120,000,000KB=120,000,000,000字節(jié)換算成操作系統(tǒng)計(jì)算方法:120,000,000,000字節(jié)/1024=117,187,500KB/1024=114,440.9MB=111.8GB。4計(jì)算機(jī)存儲(chǔ)

計(jì)算機(jī)存儲(chǔ)單位一般用:b(比特)、B(字節(jié))、KB(千字節(jié))、MB(兆字節(jié))、GB(吉字節(jié))、TB(太字節(jié))、PB(拍字節(jié))、EB(艾字節(jié))、ZB(皆字節(jié))、YB(佑字節(jié))、NB(諾字節(jié))、DB(刀字節(jié))來表示。

計(jì)算機(jī)中的數(shù)據(jù)都是用二進(jìn)制數(shù)表示的,所以信息的最小單位就是一個(gè)二進(jìn)制位(BIT),但是計(jì)算機(jī)處理信息時(shí)一般是以字節(jié)(BYTE)為單位,一個(gè)字節(jié)是8位的二進(jìn)制數(shù),在存儲(chǔ)器中存放也是一個(gè)單元存放一個(gè)字節(jié)。

最小單位bit是一位二進(jìn)制編碼,但是這一個(gè)編碼所能存儲(chǔ)的信息太少,僅一個(gè)漢字就需要16位二進(jìn)制編碼,所以為了方便存儲(chǔ)規(guī)定8位為一字節(jié),一個(gè)字節(jié)也正好可以存儲(chǔ)一個(gè)英文字母,因此,字節(jié)就成了基礎(chǔ)單位。5進(jìn)制數(shù)什么是進(jìn)制數(shù)?

進(jìn)制就是一種表示數(shù)字的方法,常用的是二進(jìn)制,八進(jìn)制,十進(jìn)制,十六進(jìn)制。6二進(jìn)制與十進(jìn)制1.二進(jìn)制轉(zhuǎn)十進(jìn)制

二進(jìn)制:由0和1兩個(gè)數(shù)字表示的數(shù),“逢二進(jìn)一”,“借一當(dāng)二”(進(jìn)位規(guī)則)(1011)2=1x23+0x22+1x21+1x20=(11)10規(guī)則:個(gè)位上的次數(shù)是0,十位上的為1,依次遞增

十分位上的數(shù)字次數(shù)為-1,百分位上的數(shù)字為-2依次遞減。7二進(jìn)制與十進(jìn)制2.十進(jìn)制轉(zhuǎn)二進(jìn)制(89)10=(1011001)289/2=1(余1)整數(shù)規(guī)則:除以2取余,逆序排列44/2=0小數(shù)規(guī)則:乘以2取整,順序排列22/2=0例:(0.625)10=(0.101)211/2=10.625x2=1.25取15/2=10.25x2=0.5取02/2=00.5x2=1.00取118二進(jìn)制與八進(jìn)制二進(jìn)制轉(zhuǎn)八進(jìn)制

從小數(shù)點(diǎn)開始,整數(shù)部分向左、小數(shù)部分向右,每3位為一組用一位八進(jìn)制數(shù)的數(shù)字表示,不足3位的要用“0”補(bǔ)足3位,就得到一個(gè)八進(jìn)制數(shù)。八進(jìn)制數(shù)字與二進(jìn)制數(shù)字對(duì)應(yīng)關(guān)系如下:000->0100->4001->1101->5010->2110->6011->3111->7二進(jìn)制:010110.001100八進(jìn)制:26.14即:(10110.0011)2=(26.14)89二進(jìn)制與八進(jìn)制八進(jìn)制轉(zhuǎn)二進(jìn)制

八進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù):把每一個(gè)八進(jìn)制數(shù)轉(zhuǎn)換成3位的二進(jìn)制數(shù),就得到一個(gè)二進(jìn)制數(shù)。八進(jìn)制:37.416二進(jìn)制:011111.100001110即:(37.416)8=(11111.10000111)210二進(jìn)制與十六進(jìn)制二進(jìn)制轉(zhuǎn)十六進(jìn)制

二進(jìn)制數(shù)轉(zhuǎn)換成十六進(jìn)制數(shù):從小數(shù)點(diǎn)開始,整數(shù)部分向左、小數(shù)部分向右,每4位為一組用一位十六進(jìn)制數(shù)的數(shù)字表示,不足4位的要用“0”補(bǔ)足4位,就得到一個(gè)十六進(jìn)制數(shù)。十六進(jìn)制數(shù)字與二進(jìn)制數(shù)字的對(duì)應(yīng)關(guān)系如下:0000->0

0100->4

1000->8

1100->C0001->1

0101->5

1001->9

1101->D0010->2

0110->6

1010->A

1110->E0011->3

0111->7

1011->B

1111->F二進(jìn)制:01100001.1110十六進(jìn)制:61.E即:(1100001.111)2=(61.E)1611二進(jìn)制與十六進(jìn)制十六進(jìn)制轉(zhuǎn)二進(jìn)制

十六進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù):把每一個(gè)十六進(jìn)制數(shù)轉(zhuǎn)換成4位的二進(jìn)制數(shù),就得到一個(gè)二進(jìn)制數(shù)。十六進(jìn)制:5DF.9二進(jìn)制:0101

11011111.1001即:(5DF.9)16=(10111011111.1001)212運(yùn)算符算術(shù)運(yùn)算符

單目:+(取正)-(取負(fù))++(自增1)--(自減1)

雙目:+-*/%(取余)

三目:a>b?true:false說明:當(dāng)a大于b的時(shí)候,為true(也就是冒號(hào)之前的值),否則為false;這整個(gè)運(yùn)算符包括一個(gè)關(guān)系運(yùn)算符(可以是“>”"<""!="等等),一個(gè)“?”,一個(gè)“:”,冒號(hào)前后需要有兩個(gè)表達(dá)式或者是值或者是對(duì)象。關(guān)系運(yùn)算符

等于符號(hào):==,不等于符號(hào):!=,大于符號(hào):>,小于符號(hào):<,大于等于符號(hào):>=,小于等于符號(hào):<=。13位運(yùn)算符

與(&)、非(!)、或(|)、異或(^)

&:雙目運(yùn)算符,運(yùn)算時(shí)均把運(yùn)算數(shù)轉(zhuǎn)換為二進(jìn)制再做比較,規(guī)則:當(dāng)相同的位上均為1時(shí)結(jié)果為1,否則結(jié)果為0.如:1010&1101,轉(zhuǎn)為二進(jìn)制:10001001101&1111110010比較結(jié)果為:1000000轉(zhuǎn)為十進(jìn)制:64所以1010&1101=64;

|:當(dāng)兩邊操作數(shù)的位有一邊為1時(shí),結(jié)果為1,否則為0。如1100|1010=1110

!:0變1,1變0

^:兩邊的位不同時(shí),結(jié)果為1,否則為0.如1100^1010=0110邏輯運(yùn)算符

與(&&)、非(!)、或(||)14字節(jié)

字節(jié)(Byte)是計(jì)算機(jī)信息技術(shù)用于計(jì)量存儲(chǔ)容量和傳輸容量的一種計(jì)量單位,一個(gè)字節(jié)等于8位二進(jìn)制數(shù),在UTF-8編碼中,一個(gè)英文字符等于一個(gè)字節(jié)。

數(shù)據(jù)存儲(chǔ)是以“字節(jié)”(Byte)為單位,數(shù)據(jù)傳輸是以“位”(bit)為單位,一個(gè)位就代表一個(gè)0或1(即二進(jìn)制),每8個(gè)位(bit)組成一個(gè)字節(jié)(Byte)。15bit、byte、位、字節(jié)、漢字的關(guān)系1bit=1二進(jìn)制數(shù)據(jù)1byte=8bit1字母=1byte=8bit1漢字=2byte=16bit1.bit:位一個(gè)二進(jìn)制數(shù)據(jù)0或1,是1bit;2.byte:字節(jié)存儲(chǔ)空間的基本計(jì)量單位,如:MySQL中定義VARCHAR(45)即是指45個(gè)字節(jié);1byte=8bit3.一個(gè)英文字符占一個(gè)字節(jié);1字母=1byte=8bit4.一個(gè)漢字占2個(gè)字節(jié);1漢字=2byte=16bit16字符與編碼的發(fā)展從計(jì)算機(jī)對(duì)多國語言的支持角度看,大致可以分為三個(gè)階段:17字符串在內(nèi)存中的存放方法:18字符,字節(jié),字符串理解編碼的關(guān)鍵,是要把字符的概念和字節(jié)的概念理解準(zhǔn)確。這兩個(gè)概念容易混淆,我們?cè)诖俗鲆幌聟^(qū)分:19字符集與編碼各個(gè)國家和地區(qū)所制定的不同ANSI編碼標(biāo)準(zhǔn)中,都只規(guī)定了各自語言所需的“字符”。比如:漢字標(biāo)準(zhǔn)(GB2312)中沒有規(guī)定韓國語字符怎樣存儲(chǔ)。這些ANSI編碼標(biāo)準(zhǔn)所規(guī)定的內(nèi)容包含兩層含義:1.使用哪些字符。也就是說哪些漢字,字母和符號(hào)會(huì)被收入標(biāo)準(zhǔn)中。所包含“字符”的集合就叫做“字符集”。2.規(guī)定每個(gè)“字符”分別用一個(gè)字節(jié)還是多個(gè)字節(jié)存儲(chǔ),用哪些字節(jié)來存儲(chǔ),這個(gè)規(guī)定就叫做“編碼”。各個(gè)國家和地區(qū)在制定編碼標(biāo)準(zhǔn)的時(shí)候,“字符的集合”和“編碼”一般都是同時(shí)制定的。因此,平常我們所說的“字符集”,比如:GB2312,GBK,JIS等,除了有“字符的集合”這層含義外,同時(shí)也包含了“編碼”的含義。“UNICODE字符集”包含了各種語言中使用到的所有“字符”。用來給UNICODE字符集編碼的標(biāo)準(zhǔn)有很多種,比如:UTF-8,UTF-7,UTF-16,UnicodeLittle,UnicodeBig等。20Java數(shù)據(jù)流的處理[內(nèi)容提要]大部分程序都需要數(shù)據(jù)的輸入和輸出,從鍵盤讀取數(shù)據(jù),向文件寫入數(shù)據(jù)或從文件獲取數(shù)據(jù),將數(shù)據(jù)通過打印機(jī)打印出來,通過網(wǎng)絡(luò)進(jìn)行信息交換21第1節(jié)輸入/輸出概念一、流的概述Java使用流(stream)來執(zhí)行輸入輸出(I/O)的功能,流是一種數(shù)據(jù)的源頭和目的之間的通信途徑。用于讀入數(shù)據(jù)稱為輸入流(inputstream),用于寫出數(shù)據(jù)稱為輸出流(outputstream)。當(dāng)使用流時(shí)需要使用java.io包,因此在涉及數(shù)據(jù)流操作的程序中都要先導(dǎo)入java.io包:importjava.io.*;22二、I/O類層次結(jié)構(gòu)Java提供超過60個(gè)不同的流類型,這些流類包含在上面提到的java.io包中,四個(gè)基本的抽象類:InputStream、OutputStream、Reader和Writer。23事實(shí)上,我們經(jīng)常使用的是派生自他們的子類。java.io包的結(jié)構(gòu)如圖11-1:24三、標(biāo)準(zhǔn)輸入輸出在System類中有三個(gè)靜態(tài)域System.in、System.out和System.err??梢栽跇?biāo)準(zhǔn)位置使用這三個(gè)系統(tǒng)流進(jìn)行I/O操作。publicstaticInputStreamin讀取字符數(shù)據(jù)的標(biāo)準(zhǔn)輸入流。publicstaticPrintStreamout顯示或打印輸出信息的標(biāo)準(zhǔn)輸出流publicstaticPrintStreamerr輸出錯(cuò)誤信息的標(biāo)準(zhǔn)錯(cuò)誤流。25第2節(jié)文件的順序訪問一、字節(jié)流字節(jié)流是用來讀寫8位的數(shù)據(jù),由于不會(huì)對(duì)數(shù)據(jù)作任何轉(zhuǎn)換,因此可以用來處理二進(jìn)制的數(shù)據(jù)。(一)、OutputStream(二)、InputStream(三)、和(四)、ByteArrayInputStream和ByteArrayOutputStream(五)、BufferedInputStream和BufferedOutputStream26InputStreamStringBufferInputStreamByteArrayInputStreamSequenceInputStreamPipedInputStreamFilterInputStreamBufferedInputStreamLineNumberInputStreamDataInputStreamPushbackInputStreamOutputStreamByteArrayOutputStreamPipedOutputStreamFilterOutputStreamBufferedOutputStreamPrintStreamDataOutputStream輸入流輸出流的類繼承關(guān)系27(一)、OutputStreamOutputStream為所有的字節(jié)流輸出流的父類,因此所有源自于它的類也會(huì)繼承下列的方法:voidwrite(intb):寫入一個(gè)字節(jié)的數(shù)據(jù)。voidwrite(byte[]buttfer):講數(shù)組buffer的數(shù)據(jù)寫入流。voidwrite(byte[],intoffsetintlen):從buffer[offset]開始,寫入len個(gè)字節(jié)的數(shù)據(jù)。voidflush():強(qiáng)制將buffer內(nèi)的數(shù)據(jù)寫入流。voidclose():關(guān)閉流。28(二)、InputStreamInputStream為所有的字節(jié)輸入流的父類,因此所有源于它的類也會(huì)繼承下列的方法:intread():讀入一個(gè)字節(jié)的數(shù)據(jù),如果已達(dá)到文件的末端,返回值為-1。intread(byte[]buffer):讀出buffer大小的數(shù)據(jù),返回值為實(shí)際所讀出的字節(jié)。intread(byte[]buffer,intoffset,intlen):將讀出的數(shù)據(jù)從buffer[offset]開始,寫入len個(gè)字節(jié)至buffer中,返回值為實(shí)際所讀出的字節(jié)數(shù)目。intavailable():返回流內(nèi)可供讀取的字節(jié)數(shù)目。longskip(longn):跳過n個(gè)字節(jié)的數(shù)據(jù),返回值為實(shí)際所跳過的數(shù)據(jù)數(shù)。voidclose():關(guān)閉流。29(三)、和用來讀取一個(gè)文件,用來將數(shù)據(jù)寫入文件。常用的構(gòu)造函數(shù)如下:(Stringname):打開文件name用來讀取數(shù)據(jù)。():打開文件file用來讀取數(shù)據(jù)。(Stringname):打開文件name用來寫入數(shù)據(jù)。():打開文件file用來寫入數(shù)據(jù)。(Stringname,Booleanappend):打開文件name用來寫入數(shù)據(jù),若append為true,則寫入的數(shù)據(jù)會(huì)加到原有文件后面,否則,覆蓋原有的文件。30將復(fù)制為。程序首先打開文件,使用read()將其內(nèi)容逐字節(jié)讀取出來(如果返回值為-1,則表明已到達(dá)文件尾端),再使用write()將讀出的字節(jié)逐一寫入另一個(gè)文件中。若文件無法打開(例如不存在)或無法生成(),會(huì)拋出異常,若讀寫出錯(cuò),則會(huì)拋出IOException異常。最后,我們?cè)趂inally中關(guān)閉文件。31例11-232(四)、ByteArrayInputStream和 ByteArrayOutputStream使用這兩個(gè)流類可以將數(shù)據(jù)轉(zhuǎn)換到一個(gè)數(shù)據(jù)類型為字節(jié)類型的數(shù)組(bytearray)中,ByteArrayInputStream和ByteArrayOutputStream并沒有牽涉到真正的文件,他們使用內(nèi)存(一個(gè)流緩沖區(qū))作為I/O流的源頭及目的。ByteArrayInputStream用來從一個(gè)流緩沖區(qū)(字節(jié)數(shù)組)中讀入數(shù)據(jù),ByteArrayOutputStream用來將數(shù)據(jù)轉(zhuǎn)換至一個(gè)流緩沖區(qū)中由于流對(duì)象的內(nèi)容存放在內(nèi)存中,所以可提供較快的操作。33常用的構(gòu)造函數(shù)如下:

ByteArrayInputStream(byte[]buffer):生成一個(gè)字節(jié)數(shù)組的輸入流,并指定一個(gè)字節(jié)數(shù)組buffer為此輸入流的流緩沖區(qū)。ByteArrayOutputStream():生成一個(gè)字節(jié)數(shù)組的輸出流,其緩沖區(qū)的默認(rèn)初始大小為32字節(jié),若有需要,緩沖區(qū)的大小會(huì)隨之增加。ByteArrayOutputStream(intsize):同上,但分配size字節(jié)的初始大小給此緩沖區(qū)。ByteArrayOutputStream的一些常用方法:intsize():返回此流緩沖區(qū)的大小。byte[]toByteArray():生成一個(gè)新的字節(jié)數(shù)組,并將流的內(nèi)容復(fù)制到此字節(jié)數(shù)組。StringtoString():將流的內(nèi)容轉(zhuǎn)換為String對(duì)象。下面程序讀入文件data.in,將其內(nèi)容寫入內(nèi)存中(一個(gè)字節(jié)數(shù)組),接著轉(zhuǎn)換為String對(duì)象,并將該String對(duì)象內(nèi)的令牌解析出來。34例11-3ByteIO.java35若輸入數(shù)據(jù)(data.in中的數(shù)據(jù))如下:Aa00001926995Bb00002779296則程序輸出如下:Aa00001926995Bb0000277929636(五)、BufferedInputStream和BufferedOutputStream有時(shí)候我們?cè)谔幚韥碜暂斎肓鞯臄?shù)據(jù)時(shí),希望能夠重設(shè)流并回到較靠前的位置。這需要使用緩沖來實(shí)現(xiàn),通過使用BufferedInputStream類,可以利用mark和reset方法在緩沖的輸入流中往回移動(dòng);同時(shí),通過使用BufferedOutputStream類,可以先將輸出寫到內(nèi)存緩沖區(qū),再使用flush方法將數(shù)據(jù)寫入磁盤,而不必每輸出一個(gè)字節(jié)就向磁盤中寫一次數(shù)據(jù)。371.BufferedInputStream類的構(gòu)造函數(shù)和方法BufferedInputStream(InputStreamin):構(gòu)造一個(gè)BufferedInputStream。BufferedInputStream(InputStreamin,intsize):構(gòu)造一個(gè)具有給定的緩沖區(qū)大小的BufferedInputStream。intavailable():得到可以從這個(gè)輸入流讀取的字節(jié)數(shù)。voidclose():關(guān)閉流。voidmark(intreadlimit):在這個(gè)輸入流的當(dāng)前位置做標(biāo)記。booleanmarkSupported():檢查這個(gè)輸入流是否支持mark和reset方法。intread():讀取數(shù)據(jù)的下一個(gè)字節(jié)。intread(byte[]b,intoff,intlen):從這個(gè)字節(jié)輸入流的給定偏移量處開始讀取字節(jié),存儲(chǔ)到給定的字節(jié)數(shù)組。voidreset():將緩沖區(qū)重新設(shè)置到加標(biāo)記的位置。longskip(longn):跳過n個(gè)字節(jié)的數(shù)據(jù)。382.BufferedOutputStream類的構(gòu)造函數(shù)和方法:BufferedOutputStream(OutputStreamout):構(gòu)造一個(gè)BufferedOutputStream。BufferedOutputStream(OutputStreamout,intsize):構(gòu)造一個(gè)具有給定的緩沖區(qū)大小的BufferedOutputStream。voidflush():刷新這個(gè)流。voidwrite(byte[]b,intoff,intlen):將給定的字節(jié)數(shù)組寫到這個(gè)緩沖輸出流。voidwrite(intb):將給定的字節(jié)寫到這個(gè)緩沖輸出流。下面我們通過一個(gè)例子來演示BufferedInputStream類的作用,程序讀取并顯示字節(jié)數(shù)組中的字符,當(dāng)遇到’%’字符時(shí),如果和下一個(gè)’%’字符之間的字符沒有空格,則兩個(gè)’%’之間的字符不顯示:39例11-4bufinstreams.java運(yùn)行結(jié)果:Thisisatestofbuffer#Streams40二、字符流盡管字節(jié)流更快更高效,但是人們讀起來十分困難(因?yàn)槭嵌M(jìn)制)。接下來我們講述文本格式的輸入輸出,即字符流。字符流主要是用來支持Unicode的文字內(nèi)容,絕大多數(shù)在字節(jié)流中所提供的類,都有相對(duì)應(yīng)的字符流的類。ReaderBufferedReaderInputStreamReaderWriterPrintWriterBufferedWriterOutputStreamWriter41(一)、Reader和WriterReader是所有輸入字符流的基類,Writer是所有輸出字符流的基類。你可以使用從這兩個(gè)類派生出的類來讀寫字符流,這兩個(gè)類常用的方法與InputStream、OutputStream相類似,區(qū)別在于參數(shù)內(nèi)的byte[]需要改為char[]。42(二)、InputStreamReader和OutputStreamWriter

為了從鍵盤讀取按鍵,常常從System.in構(gòu)造一個(gè)InputStreamReader流,然后使用InputStreamReader類的read方法讀取用戶輸入的內(nèi)容。而OutputStreamWriter與InputStreamReader相對(duì),支持輸出流。431.InputStreamReader類的構(gòu)造函數(shù)和方法:InputStreamReader(InputStreamin):構(gòu)造一個(gè)InputStreamReader。InputStreamReader(InputStreamin,Stringenc):使用命名的字符編碼構(gòu)造一個(gè)InputStreamReader。voidclose():關(guān)閉流。StringgetEncoding():得到字符編碼的名稱。intread():讀取一個(gè)字符。intread(char[]cbuf,intoff,intlen):將字符讀到數(shù)組中。booleanready():如果這個(gè)流已準(zhǔn)備好,返回True。442.OutputStreamWriter類的構(gòu)造函數(shù)和方法:OutputStreamWriter(OutputStreamout):構(gòu)造一個(gè)OutputStreamWriter。OutputStreamWriter(OutputStreamout,Stringenc):使用命名的字符編碼構(gòu)造一個(gè)OutputStreamWriter。voidclose():關(guān)閉流。voidflush():刷新流。StringgetEncoding():得到這個(gè)流使用的字符編碼的名稱。voidwrite(char[]cbuf,intoff,intlen):寫字符數(shù)組的一部分。voidwrite(intc):寫一個(gè)字符。voidwrite(Stringstr,intoff,intlen):寫一個(gè)字符串的一部分。下面的程序利用InputStreamReader從鍵盤接受輸入,再將輸入的字符顯示出來:45例11-5程序運(yùn)行結(jié)果如下:輸入:a,b,c,d輸出:a,b,c,d輸入:1,2,3,4輸出:1,2,3,4輸入:^Z輸出:Bye46(三)、你可以使用類創(chuàng)建一個(gè)字符流來讀取一個(gè)文件,類只具有從InputStreamReader繼承的功能,但是它有自己的構(gòu)造函數(shù):():構(gòu)造一個(gè)。(fd):從一個(gè)文件描述符構(gòu)造一個(gè)。(String):從一個(gè)文件名構(gòu)造一個(gè)。在下面的例子中,我們打開一個(gè)文件(內(nèi)容為:”Hellofromfile”),將文件的內(nèi)容讀到緩沖區(qū),然后顯示數(shù)據(jù):47例11-6程序運(yùn)行結(jié)果如下:Hellofromfile48(四)、與對(duì)應(yīng),用來將字符緩沖區(qū)中的數(shù)據(jù)寫到文件中。這個(gè)類也只定義了構(gòu)造函數(shù),此外只具有從OutputStreamWriter繼承的功能。():從File對(duì)象構(gòu)造一個(gè)。(fd):從文件描述符構(gòu)造一個(gè)。(String):從文件名構(gòu)造一個(gè)。(String,booleanappend):構(gòu)造一進(jìn)行附加的。在下面例子中,我們分別采用三種方式:逐字符地寫數(shù)據(jù)、一次寫入所有數(shù)據(jù)、分批寫數(shù)據(jù),使用:49例11-7程序執(zhí)行后:和的內(nèi)容為:Thisisastringoftext.的內(nèi)容為:isastrin50(五)、CharArrayReader和CharArrayWriter可以用來從數(shù)組讀寫字符。1.CharArrayReader類的構(gòu)造函數(shù)和方法如下:CharArrayReader(char[]buf):從給定的字符數(shù)組構(gòu)造一個(gè)CharArrayReader。CharArrayReader(char[]buf,intoffset,intlength):同上。voidclose():關(guān)閉流。voidmark(intreadAheadLimit):在流中的當(dāng)前位置加標(biāo)記。booleanmarkSupported():如果這個(gè)流支持mark操作,那么返回True。intread():讀取一個(gè)字符。intread(char[]b,intoff,intlen):將字符讀入數(shù)組的一部分。booleanready():檢查這個(gè)流是否已經(jīng)準(zhǔn)備好被讀取。voidreset():將流重設(shè)到最近的標(biāo)記。longskip(longn):跳過n個(gè)字符。512.CharArrayWriter類的構(gòu)造函數(shù)和方法如下:CharArrayWriter():構(gòu)造一個(gè)CharArrayWriter。CharArrayWriter(intinitialSize):構(gòu)造一個(gè)具有給定初始大小的CharArrayWriter。voidclose():關(guān)閉流。voidflush():刷新流。voidreset():重設(shè)流。intsize():得到緩沖區(qū)的當(dāng)前大小。char[]toCharArray():得到輸入數(shù)據(jù)的副本。StringtoString():將輸入數(shù)據(jù)轉(zhuǎn)換為字符串。voidwrite(char[]c,intoff,intlen):將字符寫到緩沖區(qū)中。voidwrite(intc):將一個(gè)字符寫到緩沖區(qū)中。voidwrite(Stringstr,intoff,intlen):將字符串的一部分寫到緩沖區(qū)中。voidwriteTo(Writerout):將緩沖區(qū)的內(nèi)容寫到另一個(gè)字符流中。下面我們演示CharArrayReader類的作用,該例從字符數(shù)組中逐個(gè)讀取字符并顯示:52例11-8程序運(yùn)行結(jié)果為:Thisisastringoftext.53第3節(jié)目錄和文件管理File類是一個(gè)和流無關(guān)的類。File對(duì)象可以用來生成與文件(及其所在的路徑)或目錄結(jié)構(gòu)相關(guān)的對(duì)象,由于不同的系統(tǒng)可能會(huì)有不同的目錄結(jié)構(gòu)表示法,使用File類可以達(dá)到與系統(tǒng)無關(guān)的目的(使用抽象的路徑表示法)。類java.io.File提供了獲得文件基本信息及操作文件的一些方法。54File類的構(gòu)造函數(shù):path):將一個(gè)代表路徑的字符串轉(zhuǎn)換為抽象的路徑表示法。parent,Stringchild):parent代表目錄,child代表文件(不可為空)。parent,Stringchild):同上。例如:FilemyFile;myFile=newFile(“”);或myFile=newFile(“/”,””);或File(“/”);myFile=new,””);55使用何種構(gòu)造函數(shù)經(jīng)常由其他被訪問的文件對(duì)象來決定。例如,當(dāng)在應(yīng)用程序中只用到一個(gè)文件時(shí),那么使用第一種構(gòu)造函數(shù)最為實(shí)用;但是如果使用了一個(gè)共同目錄下的幾個(gè)文件,則使用第二種或第三種構(gòu)造函數(shù)會(huì)更方便。56File類一些常用的方法booleanexists():若該文件或目錄存在,返回True。booleanisDirectory():若為目錄則返回True。File[]listFiles():得到該對(duì)象所代表的目錄下的File對(duì)象數(shù)組。String[]list():同上。longlength():得到和該對(duì)象相關(guān)的文件大小,若不存在,返回0。StringtoString():得到抽象路徑表示法。StringgetParent():得到抽象路徑表示法的目錄部分。StringgetName():得到抽象路徑表示法的最后一個(gè)部分。booleanrenameTo():將當(dāng)前File對(duì)象所代表的路徑名改為newName所代表的路徑名。若成功,返回true。booleanmkdir():生成一個(gè)新的目錄。若成功,返回True。booleanmkdirs():生成一個(gè)新的目錄,包含子目錄。若成功,返回true。booleandelete():刪除目前File對(duì)象代表的文件或目錄,目錄需為空。刪除成功,返回true。57例11-9使用File類的方法得到關(guān)于文件的信息程序運(yùn)行結(jié)果如下:Theexist?trueThewrite?trueTheread?trueTheafile?trueTheadirectory?falseThefile'snameis:Thefile'sallpathis:C:\Java\Thefile'slengthis1558第4節(jié)其他常用的流處理一、管道流管道(pipe)提供一種線程之間的通信方法,可用于IPC(Inter-ProcessCommunication進(jìn)程間通信)或是ITC(Inter-ThreadCommunication線程間通信),但不能夠在不同主機(jī)間進(jìn)行通信。一個(gè)輸入管道是用來接收一個(gè)輸出管道所寫出的數(shù)據(jù),因此,一個(gè)線程會(huì)負(fù)責(zé)送出(PipedOutputStream對(duì)象)數(shù)據(jù),而另一個(gè)線程序要負(fù)責(zé)接收(PipedInputStream對(duì)象)這些數(shù)據(jù),PipedInputStream和PipedOutputStream對(duì)象總是成對(duì)出現(xiàn)的。并且由于管道的數(shù)據(jù)流是單向的59(一)、創(chuàng)建一組管道通信可以按照下面步驟進(jìn)行(使用無參數(shù)的構(gòu)造函數(shù))建立輸入流:PipedInputStreampipedinputstream=newPipedInputStream();建立輸出流:PipedOutputStreampipedoutputstream=newPipedOutputStream();將輸入輸出連接起來:pipedinputstream.connect(pipedoutputstream);或者pipedoutputstream.connect(pipedinputstream);60(二)、直接建立連接PipedInputStreampis= newPipedInputStream();PipedOutputStreampos= newPipedOutputStream(pis);或PipedOutputStreampos= newPipedOutputStream();PipedInputStreampis= newPipedInputStream(pos);61二、ZIP文件流ZIP文件是存儲(chǔ)了一個(gè)或多個(gè)文件的存檔文件,通常使用壓縮格式。從Java1.1起,Java能夠處理GZIP和ZIP格式的存檔文件。與其他的流不同,處理ZIP文件的類ZipInputStream和ZipOutputStream在java.util.zip,而不在java.io中,因此在使用ZIP文件流時(shí)記住要加上:importjava.util.*;62(一)、將文件寫入ZIP文件生成和所要生成的ZIP文件相關(guān)聯(lián)的ZipOutputStream對(duì)象。一個(gè)ZIP文件往往不止含有一個(gè)壓縮文件,我們將每個(gè)要加入的文件稱為一個(gè)ZIP入口,我們使用ZipEntry(String)來生成這些ZipEntry對(duì)象。使用putNextEntry(ZipEntryentry)將此ZIP入口加入ZIP文件。將文件內(nèi)容寫入此ZIP文件。使用closeEntry()結(jié)束當(dāng)前的ZIP入口,繼續(xù)下一個(gè)ZIP入口。(二)、讀取ZIP文件生成和所要讀入的ZIP文件相關(guān)聯(lián)的ZipInputStream對(duì)象。利用getNextEntry()得到下一個(gè)ZIP入口。63三、DataInputStream和DataOutputStreamDataInputStream類和DataOutputStream類允許通過數(shù)據(jù)流來讀寫Java的基本數(shù)據(jù)類型,包括布爾型、整型、浮點(diǎn)型等。他們的構(gòu)造函數(shù)如下:DataInputStream(InputStreaminputstream);DataOutputStream(OutputStreamoutputstream);641.DataInputStream類中處理java基本數(shù)據(jù)類型的一些方法:bytereadByte()longreadLong()doublereadDouble()intreadInt()shortreadShort()floatreadFloat()booleanreadBoolean()2.DataOutputStream類寫數(shù)據(jù)的一些方法:voidwriteByte(byteb)voidwriteInt(inti)voidwriteShort(shortsh)voidwriteLong(longl)voidwriteFloat(floatf)voidwriteDouble(doubled)voidwriteBoolean(booleanbl)65四、對(duì)象流Java中的數(shù)據(jù)流不僅能對(duì)基本數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行操作,而且也提供了把對(duì)象寫入文件或從文件中讀取對(duì)象的功能,這一功能是通過java.io包中的ObjectInputStream和ObjectOutputStream兩個(gè)類實(shí)現(xiàn)的。由于他們和DataInputStream及DataOutputStream有共同的接口,因此他們也可使用相同的方法來讀取或?qū)懭霐?shù)據(jù)。除此之外,這兩個(gè)類還有如下方法用于讀寫對(duì)象:voidwriteObject(Objectobj):ObjectOutputStream的方法,將對(duì)象寫入流。ObjectreadObject():ObjectInputStream的方法,將對(duì)象讀出。66數(shù)據(jù)類型轉(zhuǎn)換Java的數(shù)據(jù)類型分為三大類,即布爾型、字符型和數(shù)值型,而其中數(shù)值型又分為整型和浮點(diǎn)型;相對(duì)于數(shù)據(jù)類型,Java的變量類型為布爾型boolean;字符型char;整型byte、short、int、long;浮點(diǎn)型float、double。其中四種整型變量和兩種浮點(diǎn)型變量分別對(duì)應(yīng)于不同的精度和范圍。此外,我們還經(jīng)常用到兩種類變量,即String和Date。對(duì)于這些變量類型之間的相互轉(zhuǎn)換在我們編程中經(jīng)常要用到,在下面的論述中,我們將闡述如何實(shí)現(xiàn)這些轉(zhuǎn)換。

67數(shù)據(jù)類型轉(zhuǎn)換1數(shù)據(jù)類型轉(zhuǎn)換的種類java數(shù)據(jù)類型的轉(zhuǎn)換一般分三種,分別是:(1).簡單數(shù)據(jù)類型之間的轉(zhuǎn)換(2).字符串與其它數(shù)據(jù)類型的轉(zhuǎn)換(3).其它實(shí)用數(shù)據(jù)類型轉(zhuǎn)換68數(shù)據(jù)類型轉(zhuǎn)換2、簡單數(shù)據(jù)類型之間的轉(zhuǎn)換在Java中整型、實(shí)型、字符型被視為簡單數(shù)據(jù)類型,這些類型由低級(jí)到高級(jí)分別為(byte,short,char)--int--long--float--double簡單數(shù)據(jù)類型之間的轉(zhuǎn)換又可以分為:低級(jí)到高級(jí)的自動(dòng)類型轉(zhuǎn)換高級(jí)到低級(jí)的強(qiáng)制類型轉(zhuǎn)換包裝類過渡類型能夠轉(zhuǎn)換69簡單數(shù)據(jù)類型之間的轉(zhuǎn)換2.1自動(dòng)類型轉(zhuǎn)換,也稱隱式類型轉(zhuǎn)換

是指不需要書寫代碼,由系統(tǒng)自動(dòng)完成的類型轉(zhuǎn)換。由于實(shí)際開發(fā)中這樣的類型轉(zhuǎn)換很多,所以Java語言在設(shè)計(jì)時(shí),沒有為該操作設(shè)計(jì)語法,而是由JVM自動(dòng)完成。具體規(guī)則為:byte→short(char)→int→long→float→double也就是說byte類型的變量可以自動(dòng)轉(zhuǎn)換為short類型,示例代碼:byteb=10;shortsh=b;這里在賦值時(shí),JVM首先將b的值轉(zhuǎn)換為short類型,然后再賦值給sh。在類型轉(zhuǎn)換時(shí)可以跳躍。示例代碼:byteb1=100;intn=b1;70如果低級(jí)類型為char型,向高級(jí)類型(整型)轉(zhuǎn)換時(shí),會(huì)轉(zhuǎn)換為對(duì)應(yīng)ASCII碼值,例如charc='c';inti=c;System.out.println("output:"+i);輸出:output:99;對(duì)于byte,short,char三種類型而言,他們是平級(jí)的,因此不能相互自動(dòng)轉(zhuǎn)換,可以使用下述的強(qiáng)制類型轉(zhuǎn)換。shorti=99;charc=(char)i;System.out.println("output:"+c);輸出:output:c;但根據(jù)筆者的經(jīng)驗(yàn),byte,short,int三種類型都是整型,因此如果操作整型數(shù)據(jù)時(shí),最好統(tǒng)一使用int型。712.2強(qiáng)制類型轉(zhuǎn)換,也稱顯式類型轉(zhuǎn)換是指必須書寫代碼才能完成的類型轉(zhuǎn)換。該類類型轉(zhuǎn)換很可能存在精度的損失,所以必須書寫相應(yīng)的代碼,并且能夠忍受該種損失時(shí)才進(jìn)行該類型的轉(zhuǎn)換。轉(zhuǎn)換規(guī)則從存儲(chǔ)范圍大的類型到存儲(chǔ)范圍小的類型。具體規(guī)則為:double→float→long→int→short(char)→byte語法格式為:(轉(zhuǎn)換到的類型)需要轉(zhuǎn)換的值示例代碼:doubled=3.10;intn=(int)d;這里將double類型的變量d強(qiáng)制轉(zhuǎn)換成int類型,然后賦值給變量n。72

需要說明的是小數(shù)強(qiáng)制轉(zhuǎn)換為整數(shù),采用的是“去1法”,也就是無條件的舍棄小數(shù)點(diǎn)的所有數(shù)字,則以上轉(zhuǎn)換出的結(jié)果是3。

整數(shù)強(qiáng)制轉(zhuǎn)換為整數(shù)時(shí)取數(shù)字的低位,例如int類型的變量轉(zhuǎn)換為byte類型時(shí),則只去int類型的低8位(也就是最后一個(gè)字節(jié))的值。

示例代碼:

intn=123;byteb=(byte)n;intm=1234;byteb1=(byte)m;

則b的值還是123,而b1的值為-46。b1的計(jì)算方法如下:m的值轉(zhuǎn)換為二進(jìn)制是10011010010,取該數(shù)字低8位的值作為b1的值,則b1的二進(jìn)制值是11010010,按照機(jī)器數(shù)的規(guī)定,最高位是符號(hào)位,1代表負(fù)數(shù),在計(jì)算機(jī)中負(fù)數(shù)存儲(chǔ)的是補(bǔ)碼,則該負(fù)數(shù)的原碼是10101110,該值就是十進(jìn)制的-46。l注意問題強(qiáng)制類型轉(zhuǎn)換通常都會(huì)存儲(chǔ)精度的損失,所以使用時(shí)需要謹(jǐn)慎。732.3包裝類過渡類型轉(zhuǎn)換在我們討論其它變量類型之間的相互轉(zhuǎn)換時(shí),我們需要了解一下Java的包裝類,所謂包裝類,就是可以直接將簡單類型的變量表示為一個(gè)類,在執(zhí)行變量類型的相互轉(zhuǎn)換時(shí),我們會(huì)大量使用這些包裝類。Java共有六個(gè)包裝類,分別是Boolean、Character、Integer、Long、Float和Double,從字面上我們就可以看出它們分別對(duì)應(yīng)于boolean、char、int、long、float和double。而String和Date本身就是類。所以也就不存在什么包裝類的概念了。在進(jìn)行簡單數(shù)據(jù)類型之間的轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換或強(qiáng)制轉(zhuǎn)換)時(shí),我們總是可以利用包裝類進(jìn)行中間過渡。

74一般情況下,我們首先聲明一個(gè)變量,然后生成一個(gè)對(duì)應(yīng)的包裝類,就可以利用包裝類的各種方法進(jìn)行類型轉(zhuǎn)換了。例如:例1,當(dāng)希望把float型轉(zhuǎn)換為double型時(shí):floatf1=100.00f;FloatF1=newfloat(f1);Doubled1=F1.doubleValue();//F1.doubleValue()為Float類的返回double值型的方法當(dāng)希望把double型轉(zhuǎn)換為int型時(shí):doubled1=100.00;DoubleD1=newDouble(d1);inti1=D1.intValue();當(dāng)希望把int型轉(zhuǎn)換為double型時(shí),自動(dòng)轉(zhuǎn)換:inti1=200;doubled1=i1;簡單類型的變量轉(zhuǎn)換為相應(yīng)的包裝類,可以利用包裝類的構(gòu)造函數(shù)。即:Boolean(booleanvalue)、Character(charvalue)、Integer(intvalue)、Long(longvalue)、Float(floatvalue)、Double(doublevalue)而在各個(gè)包裝類中,總有形為××Value()的方法,來得到其對(duì)應(yīng)的簡單類型數(shù)據(jù)。利用這種方法,也可以實(shí)現(xiàn)不同數(shù)值型變量間的轉(zhuǎn)換,例如,對(duì)于

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論