版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章文件輸入與輸出
3.1標(biāo)準(zhǔn)輸入與輸出3.2文件操作3.3輸入流與輸出流3.4文件壓縮3.5XML解析
3.1標(biāo)準(zhǔn)輸入與輸出
3.1.1標(biāo)準(zhǔn)輸入與輸出
Java程序使用字符界面與系統(tǒng)標(biāo)準(zhǔn)輸入/輸出界面進(jìn)行數(shù)據(jù)通信,即從鍵盤讀入數(shù)據(jù),或向屏幕輸出數(shù)據(jù),這是十分常見的操作。Java系統(tǒng)定義了三個流對象,分別為:
●?標(biāo)準(zhǔn)輸入為鍵盤,定義為publicstaticfinalInputStreamin;
●?標(biāo)準(zhǔn)輸出為顯示器,定義為publicstaticfinalPrintStreamout;
●?標(biāo)準(zhǔn)錯誤顯示輸出為監(jiān)視器,定義為publicstaticfinalPrintStreamerr。
這三個流對象包含在語言包java.lang的System中。System是Java中的一個功能很強(qiáng)大的類,它不僅管理輸入、輸出流和錯誤流,利用它還可以獲得很多Java運(yùn)行時的系統(tǒng)信息。System類的所有屬性和方法都是靜態(tài)的,即調(diào)用時需要以類名System為前綴。
Java的標(biāo)準(zhǔn)輸出System.out和System.err是從打印輸出流PrintStream中繼承而來的子類。PrintStream是過濾輸出類流FilterOutputStream的子類,其中定義了向屏幕輸送不同類型數(shù)據(jù)的方法print()和println()。println()方法向屏幕輸出其參數(shù)指定的變量或?qū)ο?,然后再換行,使光標(biāo)停留在屏幕的下一行第一個字符位置。如果println()方法的參數(shù)為空,則輸出一個空行。print()方法與println()相同,不過輸出對象后不附帶回車,下一次輸出時,將輸出在同一行中。其用法如下:
System.out.println(“歡迎來到Java世界”);
System.err.println(“第”+5+“次發(fā)現(xiàn)錯誤”);
Java的標(biāo)準(zhǔn)輸入System.in從InputStream中繼承而來,用于從標(biāo)準(zhǔn)輸入設(shè)備(如鍵盤)中獲取輸入數(shù)據(jù)。當(dāng)程序需要從鍵盤讀入數(shù)據(jù)的時候,需要調(diào)用System.in的read()方法。如從鍵盤讀入一個字節(jié)的數(shù)據(jù):執(zhí)行System.in.read()方法將從鍵盤緩沖區(qū)讀入一個字節(jié)的數(shù)據(jù),然而返回的卻是16位的整型量,其低位字節(jié)是真正輸入的數(shù)據(jù),高位字節(jié)是全零。另外,作為InputStream的對象,System.in只能從鍵盤讀取二進(jìn)制的數(shù)據(jù),而不能把這些信息轉(zhuǎn)換成整數(shù)、字符、浮點數(shù)或字符串等復(fù)雜數(shù)據(jù)類型的量。
當(dāng)鍵盤緩沖區(qū)中沒有未被讀取的數(shù)據(jù)時,執(zhí)行System.in.read()將導(dǎo)致系統(tǒng)轉(zhuǎn)入阻塞狀態(tài)。在阻塞狀態(tài)下,當(dāng)前流程將停留在上述語句位置,整個程序被掛起,等用戶輸入一個鍵盤數(shù)據(jù)后,才能繼續(xù)運(yùn)行下去,所以程序中有時利用System.in.read()語句來達(dá)到暫時保留屏幕的目的。例如下面的語句段:當(dāng)希望從鍵盤輸入信息時,需要按照字符串的方式,連續(xù)輸入多個鍵值保留在鍵盤緩沖區(qū)中,等待輸入結(jié)束再轉(zhuǎn)換為相應(yīng)的數(shù)據(jù)類型。代碼注釋如下:
①第1行由于涉及輸入與輸出,因而本程序要引用java.io類庫包;
②第5行創(chuàng)建一個輸入對象流,該輸入流用于接收系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備的輸入,即鍵盤輸入;
③第7行通過調(diào)用readLine()方法實現(xiàn)按行輸入,回車符為結(jié)束;
④第8行通過鍵盤輸入的數(shù)據(jù)均為字符類型,需要將其轉(zhuǎn)換為適合的數(shù)據(jù)類型,在本例中是整數(shù)類型;
⑤第10~11行實現(xiàn)輸入一個單精度數(shù)據(jù)。3.1.2Scanner類
除了使用BufferedReader對象實現(xiàn)從System.in接收數(shù)據(jù)外,在SDK1.5中添加了java.util.Scanner類。Scanner是一個用于掃描輸入文本的類,是以前的StringTokenizer和Matcher類之間的某種結(jié)合。由于任何數(shù)據(jù)都必須通過同一模式的捕獲組檢索或通過使用一個索引來檢索文本的各個部分,因而可以結(jié)合使用正則表達(dá)式和從輸入流中檢索特定類型數(shù)據(jù)項的方法來實現(xiàn)鍵盤輸入。這樣,除了能使用正則表達(dá)式之外,Scanner類還可以任意地對字符串和基本類型(如int和double)的數(shù)據(jù)進(jìn)行分析。借助于Scanner,可以針對任何要處理的文本內(nèi)容編寫自定義的語法分析器,還可以使用該類創(chuàng)建一個對象,如下:
Scannerreader=newScanner(System.in);然后reader對象調(diào)用下列方法(函數(shù))來讀取用戶在命令行輸入的各種數(shù)據(jù)類型:nextByte(),nextDouble(),nextFloat(),nextInt(),nextLine(),nextLong(),nextShort()。上述方法執(zhí)行時都會造成堵塞,等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn)。例如,用戶通過鍵盤輸入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false。NextLine()等待用戶輸入一個文本行并且回車,該方法得到一個String類型的數(shù)據(jù)。代碼注釋如下:
①第1行由于使用Scanner類創(chuàng)建輸入對象,因而需要java.util類庫;
②第6行采用Scanner創(chuàng)建對象,使用System.in作為輸入接口;
③第9~13行連續(xù)輸入double類型的浮點數(shù)。
3.2文件操作
3.2.1File類
在文件操作中File類是很重要的類,F(xiàn)ile類提供創(chuàng)建文件和目錄以及訪問文件信息的有關(guān)操作,并利用文件名和路徑名來實例化一個文件類。
通常,在操作系統(tǒng)的文件名管理中使用與系統(tǒng)相關(guān)的路徑名字符串來命名文件和目錄。File類可給出分層路徑名的一個抽象的、與系統(tǒng)無關(guān)的視圖。抽象路徑名有兩個組件:
(1)可選的與系統(tǒng)有關(guān)的前綴字符串,如盤符,“/”表示UNIX中的根目錄,絕對路徑名的前綴始終是“?/?”,相對路徑名沒有前綴,表示根目錄的絕對路徑名的前綴為“?/?”并且沒有名稱序列。對于MicrosoftWindows平臺,包含盤符的路徑名的前綴由驅(qū)動器名和一個“:”組成;如果路徑名是絕對路徑名,后面可能跟著“\\”,則通用命名規(guī)則(UniversalNamingConvention,UNC)路徑名的前綴是“\\\\”,主機(jī)名和共享名是名稱序列中的前兩個名稱,沒有指定驅(qū)動器的相對路徑名無前綴。
(2)零個或更多字符串名稱的序列,除了最后一個,抽象路徑名中的每個名稱代表一個目錄;最后一個名稱既可以代表目錄,也可以代表文件??盏某橄舐窂矫麤]有前綴和名稱序列。路徑名字符串與抽象路徑名之間的轉(zhuǎn)換與系統(tǒng)有關(guān)。將抽象路徑名轉(zhuǎn)換為路徑名字符串時,每個名稱與下一個名稱之間由單個默認(rèn)分隔符隔開。默認(rèn)名稱分隔符由系統(tǒng)屬性file.separator定義,也可以從此類的公共靜態(tài)字段separator和separatorChar中得到。將路徑名字符串轉(zhuǎn)換為抽象路徑名時,可以使用默認(rèn)名稱分隔符或者受基礎(chǔ)系統(tǒng)支持的其他任何名稱分隔符來分隔其中的名稱。無論是抽象路徑名還是字符串路徑名,都可以是絕對路徑名或相對路徑名。絕對路徑名是完整的路徑名,不需要任何其他信息就可以定位文件。相對路徑名必須使用來自其他路徑名的信息進(jìn)行解釋,默認(rèn)情況下,java.io包中的類總是根據(jù)當(dāng)前用戶目錄來分析相對路徑名。當(dāng)前目錄則由系統(tǒng)屬性user.dir指定,通常是Java虛擬機(jī)的調(diào)用目錄。
基于Java的平臺無關(guān)性特點,Java的文件訪問機(jī)制也是獨立于文件系統(tǒng)的。File類的實例一旦創(chuàng)建,F(xiàn)ile對象表示的抽象路徑名將永不改變。File類的定義如圖3-1所示。圖3-1File類定義代碼注釋如下:
①第5行輸入文件的絕對路徑,可以使用相對路徑;
②第12~13行,如果要修改文件的名稱,則應(yīng)首先構(gòu)造一個目標(biāo)名稱的File對象,然后通過rename()方法修改;
③第16~20行,若要獲得本目錄中所有的文件列表,則首先通過getParent()獲得路徑名,再通過list()獲得文件名稱數(shù)組,就可以以循環(huán)方法輸出目錄中所有的文件名稱。
運(yùn)行結(jié)果如圖3-2所示。圖3-2exp_3_3運(yùn)行結(jié)果3.2.2RandomAccessFile類
RandomAccessFile類用于對多種格式的文件內(nèi)容進(jìn)行訪問操作,該類支持對文件內(nèi)容的隨機(jī)訪問,即可以在文件的任意位置上進(jìn)行數(shù)據(jù)存/取操作。
RandomAccessFile直接繼承Object類,并同時實現(xiàn)了DataInput和DataOutput接口,但是它不屬于InputStream和OutputStream類系,而是一個完全獨立的類。它的所有方法都是重新開始寫的,使得RandomAccessFile能在文件里面前后移動。實際上,RandomAccessFile的工作方式是把DataInputStream和DataOutputStream疊加在一起,再添加其獨有的一些方法,比如定位用的getFilePointer(),在文件里移動用的seek(),以及判斷文件大小的length()。此外,它的構(gòu)造函數(shù)還要一個表示以只讀方式(“r”),還是以讀/寫方式(“rw”)打開文件的參數(shù),但是它不支持只寫文件。只有RandomAccessFile才支持seek()方法,且該方法也只適用于文件對象。RamdomAccessFile類的定義如圖3-3所示。圖3-3RandomAccessFile類的定義代碼注釋如下:
①第1行所有的文件操作都需要引用java.io類庫包;
②第4行以讀/寫的方式打開文件random.txt;
③第5~8行按照順序?qū)懭氩紶栔?、整?shù)值、字符值和雙精度值;
④第9行文件指針跳轉(zhuǎn),因為在文件寫入時指針當(dāng)前的位置為4,通過seek()修改文件指針位置為1;
⑤第10~12行依次讀取整數(shù)值、字符值和雙精度值;
⑥第13~14行最后將指針指向0位置,讀取布爾值。
運(yùn)行結(jié)果如圖3-4所示。圖3-4exp_3_4運(yùn)行結(jié)果
3.3輸入流與輸出流
3.3.1流的概念
在Java系統(tǒng)中,采用“流(Stream)”機(jī)制來實現(xiàn)輸入/輸出操作。流指一個數(shù)據(jù)序列,它是一種邏輯上的虛擬結(jié)構(gòu),其一端是數(shù)據(jù)源端,另一端是數(shù)據(jù)目的端。流的兩端都有一定的數(shù)據(jù)緩沖區(qū)用來暫存數(shù)據(jù),數(shù)據(jù)到達(dá)后先保存在緩沖區(qū)中,等待需要的時候再讀取。發(fā)送端也是等緩沖區(qū)中暫存一定數(shù)量的數(shù)據(jù)后再發(fā)送,這樣的設(shè)計可以有效地提高傳輸效率。流的示意圖如圖3-5所示。圖3-5流的示意圖內(nèi)存數(shù)據(jù)或者Socket,信息按照一定順序在兩個端點之間流動。
在Java中,流分為輸入流(InputStream)和輸出流(OutputStream),并相應(yīng)提供了兩個抽象(abstract)的流操作類InputStream和OutputStream。以這些類為基礎(chǔ),派生了許多類用于I/O的具體操作。在Java.io包中提供了60多個流相關(guān)類,其中,一部分如圖3-6所示。圖3-6常用流流從結(jié)構(gòu)上可分為:以字節(jié)為處理單位的字節(jié)流(InputStream和OutputStream);以字符為處理單位的字符流(Reader和Writer)。字符流和字節(jié)流在讀取和輸出時的方法略微存在差別,具體如表3-1和表3-2所示。無論哪種流的形式,I/O操作的一般步驟如下:
(1)使用引入語句引入java.io包:
importjava.io.*;
(2)根據(jù)不同的數(shù)據(jù)源和I/O任務(wù),建立字節(jié)或者字符流;
(3)若需要對字節(jié)或字符流信息組織加工為數(shù)據(jù),則在已建字節(jié)或字符流對象上構(gòu)建數(shù)據(jù)流對象;
(4)用輸入/輸出對象類的成員方法進(jìn)行讀/寫操作,需要時設(shè)置讀/寫位置指針;
(5)關(guān)閉流對象。3.3.2FileInputStream類與FileOutputStream類
在Java語言中統(tǒng)一地將每個文件都視為一個順序字節(jié)流。每個文件或者結(jié)束于一個文件結(jié)束標(biāo)志,或者根據(jù)系統(tǒng)維護(hù)管理數(shù)據(jù)中所記錄的具體字節(jié)數(shù)來終止,如圖3-7所示。圖3-7文件順序當(dāng)使用Java打開一個文件時,就創(chuàng)建一個文件對象,同時使多個流與該對象關(guān)聯(lián)。最經(jīng)常使用的輸入和輸出流是FileInputStream/FileOutputStream。這兩個類是有關(guān)于文件操作的類,它們分別由InputStream/OutputStream派生而來,其主要功能是建立一個與文件相關(guān)的輸入/輸出流,提供從文件中讀取/寫入一個字節(jié)或一組數(shù)據(jù)的方法。
FileInputStream的類定義如圖3-8所示。圖3-8FileInputStream類定義在FileInputStream類提供的構(gòu)造方法中常用的有2個,分別是:
●?publicFileInputStream(Stringname)throwsFileNotFoundException,帶入?yún)?shù)為文件的絕對路徑名或者相對路徑名,如果文件未找到將拋出異常;
●?publicFileInputStream(Filefile)throwsFileNotFoundException,帶入?yún)?shù)為File對象,如果該File對象提供的文件不存在將拋出異常。
FileInputStream類中提供的重要方法包括:
●?intavailable(),獲得文件的可讀長度;
●?voidclose(),關(guān)閉輸入流,釋放資源;●?intread(),從文件中讀取一個字節(jié)長度的內(nèi)容;
●?intread(byte[]b),從文件中讀取一個字節(jié)數(shù)組長度;
●?intread(byte[]b,intoff,intlen),從文件中讀取指定長度的字節(jié)到數(shù)組中,其中off是offset的縮寫,len是length的縮寫;
●?longskip(longn),文件指針跳過字符數(shù)。
FileOutputStream類定義如圖3-9所示。圖3-9FileOutputStream類定義
FileOutputStream類中常用的構(gòu)造方法分別為:
●?publicFileOutputStream(Stringname)throwsFileNotFoundException,參數(shù)采用文件名,如果該文件存在則用新文件覆蓋舊文件,如果該文件不存在則創(chuàng)建新文件;
●?publicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundException,參數(shù)采用文件,當(dāng)append取值為true時,新數(shù)據(jù)添加在當(dāng)前文件尾部,否則覆蓋舊文件;
●?publicFileOutputStream(Filefile)throwsFileNotFoundException,參數(shù)采用File對象;
●?publicFileOutputStream(Filefile,booleanappend)throwsFileNotFoundException,參數(shù)采用File對象,當(dāng)append取值為true時,新數(shù)據(jù)添加在當(dāng)前文件尾部,否則覆蓋舊文件。
FileOutputStream類中提供的重要方法包括:
●?voidclose(),關(guān)閉輸出流,釋放資源;
●?voidwrite(byteb)throwsIOException,寫入一個字節(jié)數(shù)據(jù);
●?voidwrite(byte[]b)throwsIOException,連續(xù)寫入一個字節(jié)數(shù)組的數(shù)據(jù);
●?voidwrite(byte[]b,intoff,intlen)throwsIOException,連續(xù)寫入一定長度的字節(jié)數(shù)組數(shù)據(jù)。代碼注釋如下:
①第4~6行的變量i用于作為文件復(fù)制的中間變量,fin為文件輸入流,fout為文件輸出流;
②第7~12行創(chuàng)建一個文件輸入流,打開文件為records.txt;
③第13~18行創(chuàng)建一個文件輸出流,打開文件為backup.txt;
④第19~26行進(jìn)行文件的復(fù)制,在這里采用單字節(jié)的復(fù)制方式,效率比較低;
⑤第27~32行關(guān)閉文件流,釋放資源。
字節(jié)文件流FileInputStream/FileOutputStream只能提供純字節(jié)或字節(jié)數(shù)組的I/O,如果要進(jìn)行基本數(shù)據(jù)類型,如整數(shù)123、浮點數(shù)123.45等的輸入與輸出,需要使用過濾流類來處理。過濾流是建立在字節(jié)流和字符流的基礎(chǔ)上的數(shù)據(jù)流。過濾輸入流從其他輸入流獲得輸入,而過濾輸出流則是向其他輸出流輸出。構(gòu)造過濾流時必須要以另一個流作為參數(shù)傳遞給構(gòu)造器。通常,過濾流被稱為高級流。3.3.3DataInputStream類和DataOutputStream類
在對數(shù)據(jù)類型的文件進(jìn)行輸入與輸出操作時,常用的兩個類是DataInputStream和DataOutputStream。它們提供了與平臺無關(guān)的數(shù)據(jù)操作,可以得到Java的各種基本類型的數(shù)據(jù)。這兩個類必須和一個I/O對象聯(lián)系起來,而不能直接使用文件名或者對象建立。類的定義如圖3-10所示。
這兩個類提供了對于簡單數(shù)據(jù)類型的操作方法,如表3-3所示。圖3-10DataInputStream/DataOutputStream類定義
【例3-6】使用FileOutputStream類和FileInputStream類實現(xiàn)文件操作,保存和讀取Fibnacci數(shù)列。
代碼注釋如下:
①第5~6行實現(xiàn)采用輸出流的方法,打開一個用于保存數(shù)據(jù)的文件fib.dat,并采用DataOutputStream與之關(guān)聯(lián);
②第7~13行創(chuàng)建Fibnacci數(shù)列;
③第14行通過flush()方法將輸出緩存中數(shù)據(jù)寫入磁盤文件中;
④第15~16行關(guān)閉輸出文件流;
⑤第21~22行創(chuàng)建輸入文件流;
⑥第23~27行通過readInt()方法讀取文件中保存的數(shù)字?jǐn)?shù)據(jù);
⑦第28~29行關(guān)閉輸入文件流。
3.4文件壓縮
3.4.1壓縮原理
數(shù)據(jù)壓縮是通過數(shù)學(xué)運(yùn)算將較大尺寸的文件變?yōu)檩^小尺寸的文件的數(shù)字處理技術(shù),常用于文件的存儲和網(wǎng)絡(luò)傳輸。利用算法將文件有損或無損地壓縮處理,以達(dá)到保留最多文件信息,而令文件體積變小的目的。大多數(shù)計算機(jī)文件類型都包含相當(dāng)多的冗余內(nèi)容——它們會反復(fù)列出一些相同的信息。文件壓縮程序就是要消除這種冗余現(xiàn)象。與反復(fù)列出某一塊信息不同,文件壓縮程序只列出該信息一次,然后當(dāng)它在原始程序中出現(xiàn)時再重新引用它。壓縮文件的基本原理是查找文件內(nèi)的重復(fù)字節(jié),并建立一個相同字節(jié)的“詞典”文件,并用一個代碼表示。比如:肯尼迪(JohnF.Kennedy)在1961年的就職演說中曾說過下面這段著名的話:Asknotwhatyourcountrycandoforyou——askwhatyoucandoforyourcountry.(不要問國家能為你做些什么,而應(yīng)該問自己能為國家做些什么。)這段話有17個單詞,包含61個字母、16個空格、1個破折號和1個句點。如果每個字母、空格或標(biāo)點都占用1個內(nèi)存單元,那么文件的總大小為79個單元。為了減小文件的大小,需要找出冗余的部分。如果忽略大小寫字母間的區(qū)別,這個句子有一半是冗余的。9個單詞(ask,not,what,your,country,can,do,for,you)幾乎提供了組成整句話所需的所有東西。為了構(gòu)造出另一半句子,可拿出前半段句子中的單詞,然后加上空格和標(biāo)點。因此,得到的字典是:ask,what,your,country,can,do,for,you。最后存儲的內(nèi)容是:1not2345678——12856734。由于計算機(jī)處理的信息是以二進(jìn)制數(shù)的形式表示的,因此壓縮軟件就是把二進(jìn)制信息中相同的字符串以特殊字符標(biāo)記來達(dá)到壓縮的目的。其實,所有的計算機(jī)文件歸根結(jié)底都是以“1”和“0”的形式存儲的,只要通過合理的數(shù)學(xué)計算公式,文件的體積都能夠被大大壓縮以達(dá)到“數(shù)據(jù)無損稠密”的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數(shù)據(jù)不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應(yīng)用于動畫、聲音和圖像文件中,典型的代表就是視頻文件格式mpeg、音頻文件格式mp3和圖像文件格式j(luò)pg。但是更多情況下壓縮數(shù)據(jù)必須準(zhǔn)確無誤,人們便設(shè)計出了無損壓縮格式,比如常見的zip,rar等。壓縮軟件自然就是利用壓縮原理壓縮數(shù)據(jù)的工具,壓縮后所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當(dāng)然,壓縮包已經(jīng)是另一種文件格式了,如果你想使用其中的數(shù)據(jù),首先得用壓縮軟件把數(shù)據(jù)還原,這個過程稱作解壓縮。常見的壓縮軟件有winzip,winrar等。在網(wǎng)絡(luò)通信時,如果需要文件的傳輸,使用壓縮數(shù)據(jù)的機(jī)制,可以減小文件的大小,有效地利用網(wǎng)絡(luò)帶寬和節(jié)省數(shù)據(jù)傳輸時間。所以,從互聯(lián)網(wǎng)上下載的程序和文件,可能很多都是經(jīng)過壓縮的。3.4.2Java的壓縮實現(xiàn)
Java實現(xiàn)了I/O數(shù)據(jù)流與網(wǎng)絡(luò)數(shù)據(jù)流的單一接口,因此壓縮、網(wǎng)絡(luò)傳輸和解壓縮容易實現(xiàn)。在java.util.zip類庫包中提供了標(biāo)準(zhǔn)讀/寫ZPI和GZIP文件方法。
一個ZIP文件由多個文件組成,在Java中采用入口(entry)來標(biāo)識,每個entry有一個唯一的名稱,entry的數(shù)據(jù)項存儲壓縮數(shù)據(jù),如圖3-11所示。
為了實現(xiàn)對于ZIP文件的描述,在Java語言中提供了兩個類,分別是ZipFile和ZipEntry。圖3-11Zip文件
1.ZipFile類
ZipFile類用于創(chuàng)建一個ZIP格式壓縮文件的對象,其作用類似于文件描述File類,如圖3-12所示。
在ZipFile中常用的構(gòu)造方法有:
●?publicZipFile(Filefile)throwsZipException,IOException,根據(jù)輸入的文件對象創(chuàng)建ZipFile對象;
●?publicZipFile(Stringname)throwsIOException,根據(jù)輸入的文件名創(chuàng)建ZipFile對象;
●?publicZipFile(Filefile,intmode)throwsIOException,根據(jù)文件對象和編輯模式創(chuàng)建對象,其中mode取值為OPEN_READ或者OPEN_READ|OPEN_DELETE。圖3-12ZipFile類定義
ZipFile類提供的重要的方法有:
●?voidclose(),關(guān)閉壓縮文件,釋放資源;
●?Enumerationentries(),獲得壓縮包內(nèi)文件列表;
●?ZipEntrygetEntry(Stringname),獲得指定的壓縮包內(nèi)文件名的入口;
●?InputStreamgetInputStream(ZipEntryentry)throwsIOException,獲得指定被壓縮文件的輸入流;
●?intSize(),獲得壓縮包內(nèi)文件的數(shù)量。
2.ZipEntry類
ZipEntry類用于創(chuàng)建一個ZIP格式壓縮文件的入口對象,其定義如圖3-13所示。圖3-13ZipEntry類定義
ZipEntry類的常用構(gòu)造方法為:
●?ZipEntry(Stringname),創(chuàng)建一個指定被壓縮文件的入口對象。
ZipEntry類提供的主要方法包括:
●?StringgetName(),獲得被壓縮文件名稱;
●?longgetSize(),獲得被壓縮文件經(jīng)壓縮后的尺寸;
●?longgetTime(),獲得被壓縮的時間;
●?booleanisDirectory(),判斷是否為目錄。
除了ZipFile類和ZipEntry類以外,還需要ZipInputStream類和ZipOutputStream類,實現(xiàn)對壓縮文件的輸入與輸出,后兩個類定義如圖3-14所示。圖3-14ZipInputStream類和ZipOutputStream類定義
代碼注釋如下:
①第1~3行引入必要的類庫包;
②第5~6行分別列出壓縮文件名稱和被壓縮的目錄名稱;
③第13~14行設(shè)置生成的壓縮文件流;
④第15行設(shè)置壓縮文件的目錄層次最大為9;
⑤第16行獲得被壓縮目錄中的文件名稱數(shù)組;
⑥第17~30行為目錄中的每一個文件構(gòu)造ZipEntry對象,通過read()方法從原始文件中讀取數(shù)據(jù),通過write()方法寫入壓縮文件中。
運(yùn)行結(jié)果如圖3-15所示。圖3-15實現(xiàn)ZIP壓縮
【例3-8】對壓縮文件解壓縮。
代碼注釋如下:
①第11行指定待解壓縮的文件history.zip;
②第16行生成ZipFile對象;
③第17行獲得壓縮文件中各被壓縮文件的入口列表;
④第19行利用while循環(huán)實現(xiàn)對被壓縮文件列表的訪問;
⑤第22行判斷是否為目錄,是則建立目錄;
⑥第25行如果是文件,則進(jìn)行解壓縮操作。
運(yùn)行結(jié)果如圖3-16所示。圖3-16解壓縮運(yùn)行結(jié)果
3.5XML解析
3.5.1XML中
XML(eXtensibleMarkupLanguage,可擴(kuò)展標(biāo)記語言)是一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言。XML是標(biāo)準(zhǔn)通用標(biāo)記語言(StandardGeneralizedMarkupLanguage,SGML)的子集,非常適合Web傳輸。XML提供統(tǒng)一的方法來描述和交換獨立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。XML的平臺無關(guān)性、語言無關(guān)性、系統(tǒng)無關(guān)性,給數(shù)據(jù)集成與交互帶來了極大的方便,使它成為一種通用的數(shù)據(jù)交換格式。在XML中大量使用了標(biāo)簽,這些標(biāo)簽由包圍在一個小于號(?<?)和一個大于號(?>?)之間的文本組成,例如?<tag>。起始標(biāo)簽(starttag)表示一個特定區(qū)域的開始,例如?<start>;結(jié)束標(biāo)簽(endtag)定義了一個區(qū)域的結(jié)束,除了在小于號之后緊跟著一個斜線(?/?)外,其他和起始標(biāo)簽基本一樣,例如?</end>。SGML還定義了標(biāo)簽的特性(attribute),它們是定義在小于號和大于號之間的值,例如?<imgsrc="picture.jpg">中的src特性。
【例3-9】
一個簡單的XML文件。
<?xmlversion=“1.0”encoding=“UTF-8”?>
<chat>
<message>
<sender>張華</sender>
<receiver>李明</receiver>
<content>你好,我來自西安</content>
</message>
</chat>
XML在不同的語言里解析方式都是一樣的,只不過實現(xiàn)的語法不同而已。基本的解析方式有兩種,一種叫SAX,另一種叫DOM。SAX是基于事件流的解析,DOM是基于XML文檔樹結(jié)構(gòu)的解析。其中DOM是W3C的正式推薦,本節(jié)主要介紹Java應(yīng)用程序如何使用DOM解析或轉(zhuǎn)換XML文件。要創(chuàng)建DOM或SAX解析器,需要使用JAXP(JavaAPIforXMLProcessing)。為了簡化編寫處理XML的Java程序,人們已經(jīng)建立了多種編程接口。這些接口或者由公司定義,或者由標(biāo)準(zhǔn)體或用戶組定義,以滿足XML程序員的需要。主要的編程接口有以下四種:
●?DocumentObjectModel(DOM,文檔對象模型),Level2;
●?SimpleAPIforXML(SAX)Version2.0;
●?JDOM,JasonHunter和BrettMcLaughlin創(chuàng)立的一種簡單JavaAPI;
●?Sun推出的JAXB(JavaArchitectureforXMLBinding)。3.5.2DOM4J
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車美容隔斷施工合同
- 風(fēng)力發(fā)電機(jī)組裝生產(chǎn)線合同
- 電商客服人員聘用合同范例
- 私募基金協(xié)議休假管理辦法
- 老年公寓保健員招聘協(xié)議
- 電子產(chǎn)品招投標(biāo)委托協(xié)議
- 退房協(xié)議書中
- 古董居間合同范例
- 郵輪旅游貨物裝卸合同三篇
- 貴金屬供應(yīng)合同(2篇)
- 《路德維?!べM爾巴哈和德國古典哲學(xué)的終結(jié)》導(dǎo)讀
- 新改版蘇教版六年級下冊科學(xué)全冊知識點(精編版)
- 應(yīng)用經(jīng)方治療頑固性心力衰竭課件
- 斷點管理培訓(xùn)課件-供應(yīng)商版
- 福建省泉州市南安市2023-2024學(xué)年九年級上學(xué)期期末數(shù)學(xué)試題(含解析)
- 初一數(shù)學(xué)寒假銜接班(寒假補(bǔ)課講義)
- 疼痛科護(hù)士的職業(yè)規(guī)劃與發(fā)展空間
- 浙江省杭州市西湖區(qū)2023-2024學(xué)年四年級上學(xué)期期末科學(xué)試卷
- 醫(yī)院人文培訓(xùn)課件
- 刑事辯護(hù)與刑事辯護(hù)策略
- 班級工作計劃班級現(xiàn)狀分析報告
評論
0/150
提交評論