版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目8輸入輸出流任務(wù)一掌握流及標(biāo)準(zhǔn)輸入輸出任務(wù)二掌握常用輸入輸出流的使用方法任務(wù)三掌握常用文件和目錄操作項(xiàng)目實(shí)戰(zhàn)一文件輸入輸出操作8.1 掌握流及標(biāo)準(zhǔn)輸入輸出
8.1.1流及其分類流是輸入/輸出設(shè)備的一種抽象表示,這些設(shè)備是數(shù)據(jù)源頭或是數(shù)據(jù)終點(diǎn)。Java應(yīng)用程序可以從數(shù)據(jù)源讀取數(shù)據(jù),向數(shù)據(jù)目的地寫入數(shù)據(jù)。流最簡單的分類:當(dāng)向一個(gè)流寫入數(shù)據(jù)的時(shí)候,這個(gè)流被稱為輸出流。當(dāng)從一個(gè)流讀取數(shù)據(jù)的時(shí)候,這個(gè)流被稱之為輸入流。流可以按流動(dòng)方向,處理位置,功能等分類,詳細(xì)情況請(qǐng)看書上的表8-1圖8-1流是對(duì)輸入輸出設(shè)備一種抽象表示數(shù)據(jù)
數(shù)據(jù)程序輸入流輸出流輸入設(shè)備輸出設(shè)備說明:(1)首先,程序開發(fā)者可以使程序向流中寫入數(shù)據(jù)或者從流中讀出數(shù)據(jù),你可以把它流想象成一個(gè)流入或流出你的程序的有序的數(shù)據(jù)序列;(2)其次,流必須連接到數(shù)據(jù)源或者數(shù)據(jù)目的地兩端的任何一端,你的應(yīng)用程序可以通過流來向數(shù)據(jù)源讀取數(shù)據(jù),或還可以通過流向數(shù)據(jù)目的地寫入數(shù)據(jù),即流都有自己的起點(diǎn)和終點(diǎn),并且是順序的。流是一個(gè)通道,通向數(shù)據(jù)源或者數(shù)據(jù)目的地;(3)要知道文件和流的差異。文件是一些具有永久存儲(chǔ)及特定順序的字節(jié)組成的一個(gè)有序的、具有名稱的集合。因此,對(duì)于文件,人們常會(huì)想到目錄路徑、磁盤存儲(chǔ)、文件名、文件和目錄名等方面。相反,流提供一種向后備存儲(chǔ)器寫入字節(jié)和從后備存儲(chǔ)器讀取字節(jié)的方式,后備存儲(chǔ)器可以為多種存儲(chǔ)媒介之一;(4)數(shù)據(jù)源或數(shù)據(jù)目的地,凡是可以存儲(chǔ)數(shù)據(jù)都可以作為前面兩者之一。
在編寫控制臺(tái)應(yīng)用程序時(shí),程序要讀取從鍵盤輸入的數(shù)據(jù)。那么程序是怎樣讀取從鍵盤輸入的數(shù)據(jù)呢?請(qǐng)看示例:【例8-1】從鍵盤按單個(gè)字節(jié)讀取數(shù)據(jù)。packagechapter08;publicclassReadNormalInputStreamByByte{ /** *程序8-1:按字節(jié)從鍵盤輸入中讀取數(shù)據(jù) */ publicstaticvoidmain(String[]args)throwsException{ //從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié),返回0到255范圍內(nèi)的int字節(jié)值。 intb=System.in.read();//如果因?yàn)橐呀?jīng)到達(dá)流末尾而沒有可用的字節(jié),則返回值-1 while(b!=-1){ System.out.println(b); b=System.in.read(); } }}8.1.2標(biāo)準(zhǔn)輸入流8.1.3標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤1、標(biāo)準(zhǔn)輸出
在操作系統(tǒng)中定義的三個(gè)標(biāo)準(zhǔn)流中,另一個(gè)是標(biāo)準(zhǔn)輸出流,它同樣可以通過java的類System成員獲得。它對(duì)應(yīng)于命令行的輸出,由封裝在System類的靜態(tài)out成員中且為PrintStream類型。 PrintStream類的主要寫數(shù)據(jù)的方法: print(dataTypedata)打印各種數(shù)據(jù)類型的值,dataType可以是Java的基本數(shù)據(jù)類型,也可以是字符數(shù)組、對(duì)象、字符串。 println(dataTypedata)打印各種數(shù)據(jù)類型的值,然后終止行。dataType可以是Java的基本數(shù)據(jù)類型,也可以是字符數(shù)組、對(duì)象、字符串。 printf(參數(shù)...)使用指定格式字符串和參數(shù)將格式化的字符串寫入此輸出流的便捷方法。write(intb)將指定的字節(jié)寫入此流。write(byte[]buf)將len字節(jié)從指定的初始偏移量為off的byte數(shù)組寫入此流。append(charch)將指定字符添加到此輸出流。 【例8-3】使用PrintStream流輸出各種數(shù)據(jù)類型。 packagechapter08; publicclassTestNormalOutputStream { publicstaticvoidmain(String[]args){ //輸出各種數(shù)據(jù)類型 System.out.println("HelloWorld!");//字符串 System.out.println(true);//布爾類型 System.out.println(23);//整型 System.out.println(123.3f); //浮點(diǎn)數(shù) System.out.println();//換行 System.out.println(newchar[]{'7','8','9','4','5'});//字符數(shù)組 System.out.println('H');//字符類型 System.out.println(0x234);//十六進(jìn)制整數(shù) System.out.println(122.23d); //雙精度小數(shù) System.out.println("你好!");//字符串 System.out.append('A');//字符 System.out.write(newbyte[]{1,2,3,4});//字節(jié)數(shù)組 System.out.flush();//刷新緩沖區(qū)的數(shù)據(jù) } }2、標(biāo)準(zhǔn)錯(cuò)誤
標(biāo)準(zhǔn)錯(cuò)誤輸出流,在默認(rèn)情況下它通常將錯(cuò)誤信息映射到命令行輸出,由System類的err成員封裝,且也是PrintStream類型。Java的System類提供一些簡單的靜態(tài)方法調(diào)用,允許程序開發(fā)者對(duì)標(biāo)準(zhǔn)輸入、輸出、和錯(cuò)誤流進(jìn)行重定向: setIn(InputStreamin)----重新分配“標(biāo)準(zhǔn)”輸入流。 setOut(PrintStreamout)----
重新分配“標(biāo)準(zhǔn)”輸出流。 setErr(PrintStreamerr)----重新分配“標(biāo)準(zhǔn)”錯(cuò)誤輸出流。 【例8-4】重定向方法的簡單使用。 主要代碼如下:
//獲取標(biāo)準(zhǔn)輸出流 PrintStreamconsole=System.out; //創(chuàng)建一個(gè)Redirecting.java文件輸入流,并對(duì)這個(gè)基本文件輸入流用 //BufferedInputStream流進(jìn)行裝飾。 BufferedInputStreamin=newBufferedInputStream(newFileInputStream("src/chapter08/Redirecting.java")); //創(chuàng)建一個(gè)test.out文件輸出流,并對(duì)這個(gè)基本文件輸入流用 //PrintStream流進(jìn)行裝飾。 PrintStreamout=newPrintStream(newFileOutputStream("test.out")); //重新定向標(biāo)準(zhǔn)輸入流 System.setIn(in); //重新定向標(biāo)準(zhǔn)輸出流 System.setOut(out); //重新定向標(biāo)準(zhǔn)錯(cuò)誤入流
8.2任務(wù)二掌握常用輸入輸出流使用InputStream和OutStream類是所有字節(jié)輸入流和輸出流的基類。它們都是抽象類,不能被實(shí)例化,然而,這兩個(gè)類都聲明了一些方法,這些方法為它們所表示的流定義了操作的基本集合。它的子類對(duì)于讀取二進(jìn)制的數(shù)據(jù)很有用途。Reader流和Writer流是能夠以字符流的方式讀寫字節(jié)流的對(duì)象,所以說字符流本質(zhì)上就是一個(gè)讀或?qū)憣?duì)象所面向的字節(jié)流。它們都是抽象類,不能被實(shí)例化,然而,這兩個(gè)類都聲明了一些方法,這些方法為它們所表示的流定義了讀寫字符的基本及相關(guān)操作集合。詳細(xì)的輸入輸出流的層次結(jié)構(gòu)及其上面四個(gè)類的方法,請(qǐng)看教材。8.2.3FileInputStream類和FileOutStream類的使用FileInputStream類是文件輸入流,是從文件系統(tǒng)中的某個(gè)文件中獲得輸入字節(jié),主要針對(duì)讀取的二進(jìn)制類型的文件的內(nèi)容情況下使用它 在使用它時(shí),必須先創(chuàng)建一個(gè)FileInputStream類的對(duì)象并且連接到數(shù)據(jù)源上,它提供了三個(gè)構(gòu)造方法:publicFileInputStream(Filefile)通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè)FileInputStream,該文件通過文件系統(tǒng)中的File對(duì)象file指定。publicFileInputStream(Stringname)通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè)FileInputStream,該文件通過文件系統(tǒng)中的路徑名name指定。publicFileInputStream(FileDescriptorfdObj)通過使用文件描述符fdObj創(chuàng)建一個(gè)FileInputStream,該文件描述符表示到文件系統(tǒng)中某個(gè)實(shí)際文件的現(xiàn)有連接。在對(duì)流的相關(guān)操作結(jié)束后,一定要調(diào)用此方法關(guān)閉流,或者,應(yīng)用程序或系統(tǒng)中有很多流打開的話,則耗資源。同樣,F(xiàn)ileOutStream類是文件輸出流,是用于將數(shù)據(jù)寫入File或FileDescriptor的輸出流,主要針對(duì)寫入的二進(jìn)制類型的文件的內(nèi)容情況下使用它。在使用它時(shí),必須先創(chuàng)建一個(gè)FileOutputStream類的對(duì)象并且連接到數(shù)據(jù)目的地上,它提供了五個(gè)構(gòu)造方法?!纠?-5】簡單讀取文件:讀取Java應(yīng)用程序的源代碼并正確顯示漢字。 importjava.io.*; publicclassFileInputStreamSimpeUsage { publicstaticvoidmain(String[]args){ byte[]buffer=newbyte[2056]; try { FileInputStreamfileIn=new FileInputStream("src/chapter08/FileInputStreamSimpeUsage.java"); intbytes=fileIn.read(buffer,0,2056); Stringstr=newString(buffer,0,bytes,"gb2312"); System.out.println(str);//輸出字符串 } catch(Exceptione)//捕獲異常 { //將異常信息轉(zhuǎn)換為字符串 Stringerr=e.toString(); System.out.println(err);//輸出異常信息 } }}【例8-6】編寫一個(gè)復(fù)制文件的應(yīng)用程序。代碼見教材
說明:創(chuàng)建一個(gè)輸入流fileIn連接到Sunset.jpg文件上和一個(gè)輸出流fileOut連接到Sunset1.jpg文件上,若Sunset1.jpg不存在,則會(huì)自動(dòng)創(chuàng)建這個(gè)文件,如存在則會(huì)覆蓋這個(gè)文件。聲明一個(gè)1024長度的字節(jié)數(shù)組,每次從輸入流fileIn中當(dāng)前位置startPos讀取1024個(gè)字節(jié)存放在buffer數(shù)組中,并把buffer數(shù)組的內(nèi)容通過輸入流寫入到Sunset1.jpg文件中,把當(dāng)前位置向后移動(dòng)1024個(gè)字節(jié),重復(fù)操作直到到達(dá)Sunset.jpg文件末尾。要注意是:輸入輸出流的特點(diǎn),是每個(gè)數(shù)據(jù)都必須等待排在它前面的數(shù)據(jù)讀入或送出之后才能讀寫,每次讀寫操作處理的是字節(jié)序列中剩余的未讀寫數(shù)據(jù)的第一個(gè),而不能隨意選擇輸入輸出的位置,即讀寫數(shù)據(jù)是有序的。8.2.5FileReader類和FileWriter類使用可知,F(xiàn)ileReader和FileWriter是按字符讀寫的輸入輸出流。它的基類是InputStreamReader和OutputStreamReader。在前面知道,InputStreamReader和OutputStreamWriter的基類分別是Reader和Writer,而Reader類和Writer類以及它們的子類并不是流本身,而是提供了以字符流的形式讀、寫底層流的方法。因此,Reader對(duì)象或者Writer對(duì)象通常使用底層的InputStream對(duì)象和OutputStream對(duì)象來創(chuàng)建,InputStream對(duì)象和OutputStream對(duì)象封裝有于外部設(shè)備的連接,這種外部設(shè)備就是最終的數(shù)據(jù)源或者數(shù)據(jù)目的地。要?jiǎng)?chuàng)建一個(gè)FileReader對(duì)象有三個(gè)方法,即它有三個(gè)構(gòu)造函數(shù)分別如下:FileReader(File
file)在給定從中讀取數(shù)據(jù)的File的情況下創(chuàng)建一個(gè)新FileReader。FileReader(String
fileName)在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新FileReader。FileReader(FileDescriptor
fd)在給定從中讀取數(shù)據(jù)的FileDescriptor的情況下創(chuàng)建一個(gè)新FileReader。使用方法請(qǐng)看書上的三個(gè)示例8.2.6使用BufferedReader類實(shí)現(xiàn)各種數(shù)據(jù)類型的輸入BufferedReader從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取,并且可把讀出的內(nèi)容轉(zhuǎn)換成各種數(shù)據(jù)類型。這樣,使用BufferedReader類可以實(shí)現(xiàn)各種數(shù)據(jù)類型的輸入。例如BufferedReader在讀取文本文件時(shí),會(huì)先將字符數(shù)據(jù)讀入緩沖區(qū),而之后若使用read()方法時(shí),會(huì)先從緩沖區(qū)中進(jìn)行讀取,如果緩沖區(qū)數(shù)據(jù)不足,才會(huì)再從文件中讀取。使用BufferedWriter時(shí),寫出的數(shù)據(jù)并不會(huì)先輸出至目的地,而是先儲(chǔ)存至緩沖區(qū)中,如果緩沖區(qū)中的數(shù)據(jù)滿了,才會(huì)一次對(duì)目的地進(jìn)行寫出,例如一個(gè)目標(biāo)文件,使用緩沖區(qū),同樣可以減少對(duì)磁盤的I/O動(dòng)作,可以提高程序的寫數(shù)據(jù)的效率。這兩個(gè)來的主要方法在表8-8詳細(xì)使用方法請(qǐng)看書上的三個(gè)示例
8.3任務(wù)三掌握常用目錄和文件操作獲取文件信息和更改文件屬性創(chuàng)建File對(duì)象,F(xiàn)ile類提供了四種構(gòu)造方法,分別是:publicFile(StringpathName)通過將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建一個(gè)新File實(shí)例。publicFile(Fileparent,Stringchild)根據(jù)parent抽象路徑名和child路徑名字符串創(chuàng)建一個(gè)新File實(shí)例。publicFile(Stringparent,Stringchild)根據(jù)parent路徑名字符串和child路徑名字符串創(chuàng)建一個(gè)新File實(shí)例。publicFile(Stringuri)通過將給定的file:URI轉(zhuǎn)換為一個(gè)抽象路徑名來創(chuàng)建一個(gè)新的File實(shí)例。讀者要注意:File對(duì)象實(shí)際上并代表一個(gè)文件,F(xiàn)ile對(duì)象本身并不是物理文件或路徑,而是封裝了路徑名或引用,該引用是指向硬盤上可能存在也可能不存在的物理文件或目錄。所有創(chuàng)建File對(duì)象并不意味著文件或目錄就一定存在。并且File類的實(shí)例是不可變的;也就是說,一旦創(chuàng)建,F(xiàn)ile對(duì)象表示的抽象路徑名將永不改變。8.3.2列目錄文件清單列目錄文件清單的File類的File對(duì)象的方法:String[] list()返回一個(gè)字符串?dāng)?shù)組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。
String[] list(FilenameFilterfilter)返回一個(gè)字符串?dāng)?shù)組,這些字符串指定此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。 File[] listFiles()返回一個(gè)抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中的文件。 File[] listFiles(FileFilterfilter)返回抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。 File[] listFiles(FilenameFilterfilter)返回抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。 8.3.3獲取根目錄和創(chuàng)建子目錄獲取根目錄和創(chuàng)建子目錄的File對(duì)象的方法:boolean mkdir()創(chuàng)建此抽象路徑名指定的目錄。 boolean mkdirs()創(chuàng)建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。 staticFile[] listRoots()列出可用的文件系統(tǒng)根。
上面表格中兩個(gè)對(duì)象方法、一個(gè)類方法,mkdir的功能是創(chuàng)建一個(gè)windows操作系統(tǒng)下的一個(gè)文件夾即目錄,mkdirs的功能是創(chuàng)建多個(gè)文件夾,但是必須創(chuàng)建的文件夾是要?jiǎng)?chuàng)建的文件夾及其不存在的所祖先文件夾。8.3.4文件的創(chuàng)建、更名和刪除創(chuàng)建、更名和刪除文件的File對(duì)象的方法:boolean createNewFile()當(dāng)且僅當(dāng)不存在具有此抽象路徑名指定名稱的文件時(shí),不可分地創(chuàng)建一個(gè)新的空文件。 staticFile createTempFile(Stringprefix,Stringsuffix)在默認(rèn)臨時(shí)文件目錄中創(chuàng)建一個(gè)空文件,使用給定前綴和后綴生成其名稱。 staticFile createTempFile(Stringprefix,Stringsuffix,Filedirectory)在指定目錄中創(chuàng)建一個(gè)新的空文件,使用給定的前綴和后綴字符串生成其名稱。 boolean renameTo(Filedest)重新命名此抽象路徑名表示的文件。 boolean delete()刪除此抽象路徑名表示的文件或目錄。 void deleteOnExit()在虛擬機(jī)終止時(shí),請(qǐng)求刪除此抽象路徑名表示的文件或目錄。請(qǐng)認(rèn)真閱讀一下【程序8-17】在當(dāng)前目錄下創(chuàng)建、更名、刪除文件。并上機(jī)調(diào)試。 8.3.5基本數(shù)據(jù)類型數(shù)據(jù)的讀寫類DataInputStream是實(shí)現(xiàn)了DataInput接口,它允許應(yīng)用程序以與機(jī)器無關(guān)方式從底層輸入流中讀取基本Java數(shù)據(jù)類型。如int、float、long、double和boolean等等。此外,DataInputStream的readUTF()方法還能讀取采用UTF-8字符編碼的字符串。DataInputStream類的所有讀方法采用了readXXX()模式。比如:
readByte()——從輸入流中讀取1個(gè)字節(jié),把它轉(zhuǎn)換為byte類型的數(shù)據(jù)。
readerLong()——從輸入流中讀取8個(gè)字節(jié),把它轉(zhuǎn)換為long類型的數(shù)據(jù)。readFloat()——從輸入流中讀取4個(gè)字節(jié),把它轉(zhuǎn)換為float類型的數(shù)據(jù)readUTF()——從輸入流中讀取1到3個(gè)字節(jié),把它轉(zhuǎn)換為采用UTF-8字符編碼的字符串。程序工作原理:對(duì)于以上文件輸入流,先用BufferedInputStream裝飾,在讀取數(shù)據(jù)時(shí)利用緩沖類裝飾以便提高讀取數(shù)據(jù)的效率,接著再用DataInputStream類裝飾,從而具備讀取格式化數(shù)據(jù)的功能。對(duì)于以上文件輸出流也是同樣的。以上程序輸出的結(jié)果為:
-21212中國8.3.6使用增加了緩沖的流類使用增加了緩沖的流類主要有:字節(jié)數(shù)組輸入流/輸出流(ByteArrayInputStream、ByteArrayOutputStream)和字符數(shù)組輸入流/輸出流(CharArrayReader、CharArrayWriter),這些類都包含一個(gè)受保護(hù)的成員變量----內(nèi)部緩沖區(qū)數(shù)組,并且連接上數(shù)據(jù)源或數(shù)據(jù)目的地是一個(gè)字節(jié)或字符數(shù)組。 其中ByteArrayInputStream的成員變量protectedbyte[]buf的作用----由該流的創(chuàng)建者提供的byte數(shù)組,字節(jié)緩沖區(qū), 而ByteArrayOutputStream類的成員變量protectedbyte[]buf的作用----存儲(chǔ)數(shù)據(jù)的字節(jié)緩沖區(qū);
CharArrayInputStream的成員變量protectedchar[]buf的作用----字符緩沖區(qū),CharArrayOutputStream類也有一成員變量protectedchar[]buf的作用---存儲(chǔ)數(shù)據(jù)的字符緩沖區(qū)。 其中它的成員方法詳細(xì)情況,請(qǐng)看它們的基類字節(jié)流及字符流。但它們還定義自己的成員方法。從下列示例程序中讀者可以知道它們的用法。 【例8-19】使用增加了緩沖的流類的用法。packagechapter08;importjava.io.*;publicclassByteOrCharArrayStreamUsages{ publicstaticvoidmain(String[]args)throwsIOException{ byte[]byteBuf={1,2,3,4,5,-12}; char[]charBuf={'1','a','4','t','3'}; ByteArrayInputStreaminByteArray= newByteArrayInputStream(byteBuf); CharArrayReaderinCharArray=newCharArrayReader(charBuf,1,4); intdata=inByteArray.read(); System.out.println(inByteArray.markSupported()); System.out.println(inCharArray.markSupported()); System.out.println(inByteArray.available()); while(data!=-1){ System.out.println(data); inByteArray.skip(3); data=inByteArray.read(); }
intch=inCharArray.read(); while(ch!=-1){ System.out.println(ch); ch=inCharArray.read(); } inByteArray.close(); inCharArray.close(); ByteArrayOutputStreamoutByteArray= newByteArrayOutputStream(100); CharArrayWriteroutCharArray=newCharArrayWriter(); outByteArray.write(byteBuf,2,2); outCharArray.write(charBuf,3,2); byte[]outArray=outByteArray.toByteArray(); for(byteb:outArray){ System.out.println(b); } System.out.println(outCharArray.toString()); outByteArray.close(); outCharArray.close(); }}8.3.7讀取文件指定行讀取文件指定行要用到類LineNumberReader,它是跟蹤行號(hào)的緩沖字符輸入流,其基類是BufferedReader。。它有兩個(gè)構(gòu)造方法:publicLineNumberReader(Readerin)
使用默認(rèn)輸入緩沖區(qū)的大小創(chuàng)建新的行編號(hào)reader,默認(rèn)輸入緩沖區(qū)的大小為8096個(gè)字節(jié)。pulbicLineNumberReader(Readerin,intsize)
創(chuàng)建新的行編號(hào)reader,將字符讀入給定大小的緩沖區(qū)。 例如:
FileInputReaderin=newFileInputReader(“test.java”); LineNumberReaderline=newLineNumberReader(in);
此類的詳細(xì)方法方法可參考8.3.2節(jié)它的基類Reader和JDK幫助文檔,此外,它還定義了方法setLineNumber(int)和getLineNumber(),它們可分別用于設(shè)置和獲取當(dāng)前行號(hào)。默認(rèn)情況下,行編號(hào)從0開始。請(qǐng)看示例【程序8-20】讀取文件指定行。程序工作原理:此類中定義了兩個(gè)靜態(tài)方法:getTotalLines(Filefile)方法獲取文件內(nèi)容如的總行數(shù)。其中,lines計(jì)數(shù)器用來存儲(chǔ)總行數(shù)的。readingAppointedLN(FilesourceFile,intlineNumber)方法是讀取指定行數(shù),通過類LineNumberReader的對(duì)象方法readLine(),讀取數(shù)據(jù)的單位為一行,最后關(guān)閉reader、in流。8.4項(xiàng)目實(shí)戰(zhàn)一文件輸入輸出操作1.實(shí)戰(zhàn)內(nèi)容:本實(shí)戰(zhàn)要求讀者編寫一個(gè)有關(guān)文件輸入輸出的應(yīng)用程序:實(shí)現(xiàn)操作系統(tǒng)中的復(fù)制功能,即復(fù)制一個(gè)文件或文件夾到另一個(gè)地方。運(yùn)用前面所用的編程技能,正確的編寫此應(yīng)用程序。2.實(shí)戰(zhàn)目的:通過實(shí)戰(zhàn),掌握文件輸入輸出流、File的使用;掌握File類的使用;掌握在文件處理中經(jīng)常要使用的遞歸方法。3.實(shí)戰(zhàn)過程:分析問題:拷貝一個(gè)文件的算法比較簡單請(qǐng)參考程序8-6,當(dāng)然,可以對(duì)它進(jìn)行優(yōu)化,比如使用緩沖流,提高讀寫數(shù)據(jù)的效率等。但是在復(fù)制文件夾時(shí),則需要利用Flie類在目標(biāo)文件夾中創(chuàng)建相應(yīng)的目錄,并且使用遞歸方法。importjava.io.*;
publicclassCopyDirectory{
staticStringurl1="f:/photos";//源文件夾
staticStringurl2="d:/tempPhotos";//目標(biāo)文件夾
publicstaticvoidmain(Stringargs[])throwsIOException{
//創(chuàng)建目標(biāo)文件夾
(newFile(url2)).mkdirs();
//獲取源文件夾當(dāng)前下的文件或目錄
File[]file=(newFile(url1)).listFiles();
for(inti=0;i<file.length;i++){
if(file[i].isFile()){//復(fù)制文件
copyFile(file[i],newfile(url2+file[i].getName()));
}
if(file[i].isDirectory()){ //復(fù)制目錄
StringsourceDir=url1+File.separator+file[i].getName();
StringtargetDir=url2+File.separator+file[i].getName();
copyDirectiory(sourceDir,targetDir);
}
}
}publicstaticvoidcopyFile(FilesourceFile,FiletargetFile)
throwsIOException{
//新建文件輸入流并對(duì)它進(jìn)行緩沖
FileInputStreaminput=newFileInputStream(sourceFile);
BufferedInputStreaminBuff=newBufferedInputStream(input);
//新建文件輸出流并對(duì)它進(jìn)行緩沖
FileOutputStreamoutput=newFi
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人房屋抵押民間借貸借款協(xié)議文本3篇
- 2025年度平板車租賃運(yùn)輸合同風(fēng)險(xiǎn)評(píng)估與控制
- 個(gè)人租房合同標(biāo)準(zhǔn)版可打印
- 二零二五年度處理男子外遇妻子懷孕離婚撫養(yǎng)權(quán)糾紛調(diào)解合同
- 二零二五年度智慧家居項(xiàng)目報(bào)建代理與智能家居合同2篇
- 2025年度鐵礦石進(jìn)出口關(guān)稅及稅費(fèi)繳納合同規(guī)范
- 二零二五版礦產(chǎn)資源租賃居間代理合同3篇
- 二零二五年度企事業(yè)單位廉潔從業(yè)監(jiān)督員聘任合同
- 2025阿里巴巴智能物流機(jī)器人研發(fā)及銷售合同3篇
- 重慶文化藝術(shù)職業(yè)學(xué)院《應(yīng)用文寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 《大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)》課程標(biāo)準(zhǔn)
- 第23課《出師表》課件(共56張)
- GB/T 3953-2024電工圓銅線
- 發(fā)電機(jī)停電故障應(yīng)急預(yù)案
- 接電的施工方案
- 常用藥物作用及副作用課件
- 幼兒阿拉伯?dāng)?shù)字描紅(0-100)打印版
- 社會(huì)組織等級(jí)評(píng)估報(bào)告模板
- GB/T 12173-2008礦用一般型電氣設(shè)備
- 新媒體研究方法教學(xué)ppt課件(完整版)
- 2020新版?zhèn)€人征信報(bào)告模板
評(píng)論
0/150
提交評(píng)論