AI賦能Java語(yǔ)言編程:從入門(mén)到高階 課件 第十一章 Java數(shù)據(jù)流輸入與輸出_第1頁(yè)
AI賦能Java語(yǔ)言編程:從入門(mén)到高階 課件 第十一章 Java數(shù)據(jù)流輸入與輸出_第2頁(yè)
AI賦能Java語(yǔ)言編程:從入門(mén)到高階 課件 第十一章 Java數(shù)據(jù)流輸入與輸出_第3頁(yè)
AI賦能Java語(yǔ)言編程:從入門(mén)到高階 課件 第十一章 Java數(shù)據(jù)流輸入與輸出_第4頁(yè)
AI賦能Java語(yǔ)言編程:從入門(mén)到高階 課件 第十一章 Java數(shù)據(jù)流輸入與輸出_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

數(shù)據(jù)流的輸入與輸出Inputsandoutputsofdatastreams第十一章目錄/Contents0102030405數(shù)據(jù)流的基本概念二進(jìn)制I/O流和文本I/O流節(jié)點(diǎn)流和處理流序列化和反序列化文件的處理01數(shù)據(jù)流的基本概念數(shù)據(jù)流的基本概念

數(shù)據(jù)流是指在計(jì)算機(jī)系統(tǒng)中,數(shù)據(jù)在各個(gè)處理單元之間以及系統(tǒng)內(nèi)部傳輸?shù)倪^(guò)程。這包括數(shù)據(jù)從其產(chǎn)生源(如傳感器、用戶輸入、其他系統(tǒng)等)流向處理單元,經(jīng)過(guò)處理后再流向目的地(如顯示器、存儲(chǔ)設(shè)備、另一個(gè)系統(tǒng)等)的路徑或通道。數(shù)據(jù)流可以是一組字節(jié)、數(shù)據(jù)包或其他形式的數(shù)據(jù)。11.1.1I/O流原理與流的分類一、I/O流原理:(1)I/O是Input/Output的縮寫(xiě),I/O技術(shù)是非常實(shí)用的技術(shù),用于處理數(shù)據(jù)傳輸。如讀/寫(xiě)文件,網(wǎng)絡(luò)通訊等。(2)Java程序中,對(duì)于數(shù)據(jù)的輸入/輸出操作以〞流(stream)”的方式進(jìn)行。(3)java.o包下提供了各種“流”類和接口,用以獲取不同種類的數(shù)據(jù),井通過(guò)方法輸入或輸出數(shù)據(jù)。(4)輸入input:讀取外部數(shù)據(jù)(磁盤(pán)、光盤(pán)等存儲(chǔ)設(shè)備的數(shù)據(jù))到程序(內(nèi)存)中。(5)輸出output:將程序(內(nèi)存)數(shù)據(jù)輸出到磁盤(pán)、光盤(pán)等存儲(chǔ)設(shè)備中。二、流的分類:(1)按操作數(shù)據(jù)單位不同分為:字節(jié)流(8bit)二進(jìn)制文件,字符流(按字符)文本文件(2)按數(shù)據(jù)流的流向不同分為:輸入流,輸出流(3)按流的角色的不同分為:節(jié)點(diǎn)流,處理流/包裝流流的抽象基類如表12-1所示:數(shù)據(jù)流的基本概念表11-1流的抽象基類(抽象基類)字節(jié)流字符流輸入流InputStreamReader輸出流OutputStreamWriter

?Java的IO流共涉及40多個(gè)類,實(shí)際上非常規(guī)則,都是從如上4個(gè)抽象基類派生的。

?由這四個(gè)類派生出來(lái)的子類名稱都是以其父類名作為子類名后綴,如圖12-1所示。數(shù)據(jù)流的基本概念圖11-1流的分類數(shù)據(jù)流的基本概念11.1.2輸入數(shù)據(jù)流

輸入數(shù)據(jù)流(input

stream)是指只能讀不能寫(xiě)的數(shù)據(jù)流,用于向計(jì)算機(jī)內(nèi)輸入信息而用。

java.io

包中所有輸入數(shù)據(jù)流都是從抽象類

InputStream

繼承而米,并且實(shí)現(xiàn)了其中的所有方法,包括讀取數(shù)據(jù)、標(biāo)記位置、重置讀寫(xiě)指針、獲取數(shù)據(jù)量等。從數(shù)據(jù)流中讀取數(shù)據(jù)時(shí),必須有一個(gè)數(shù)據(jù)源與該數(shù)據(jù)流相連。在處理輸入數(shù)據(jù)流時(shí),常見(jiàn)的主要數(shù)據(jù)操作方法包括以下幾種:一、讀?。≧ead):從輸入源(如文件、傳感器、用戶輸入設(shè)備等)中讀取數(shù)據(jù)。讀取的方式和方法取決于數(shù)據(jù)的來(lái)源和格式。其中常見(jiàn)的數(shù)據(jù)流訪問(wèn)方法有以下三種:文件輸入流(FileInputStream),字節(jié)數(shù)組輸入流(ByteArrayInputStream),緩沖字符輸入流(BufferedReader)。二、解析(Parse):將原始輸入數(shù)據(jù)解析為系統(tǒng)能夠理解和處理的內(nèi)部格式。這涉及將數(shù)據(jù)從其原始表示形式(例如文本、JSON、XML等)轉(zhuǎn)換為程序可以操作的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)流的基本概念三、驗(yàn)證(Validate):對(duì)輸入數(shù)據(jù)進(jìn)行驗(yàn)證,確保其符合預(yù)期的格式、范圍和規(guī)則。這有助于防范潛在的錯(cuò)誤或安全風(fēng)險(xiǎn)。四、轉(zhuǎn)換(Transform):對(duì)輸入數(shù)據(jù)進(jìn)行必要的轉(zhuǎn)換,以適應(yīng)系統(tǒng)內(nèi)部的數(shù)據(jù)模型或滿足特定的業(yè)務(wù)需求。這可能包括單位轉(zhuǎn)換、數(shù)據(jù)類型轉(zhuǎn)換等。五、過(guò)濾(Filter):根據(jù)一定的條件過(guò)濾掉不需要的數(shù)據(jù),以提取系統(tǒng)所關(guān)心的信息。這有助于降低系統(tǒng)處理的復(fù)雜度和提高效率。六、緩存(Buffer):將輸入數(shù)據(jù)暫時(shí)存儲(chǔ)在緩沖區(qū)中,以便系統(tǒng)按照其處理能力逐步處理。這對(duì)于處理實(shí)時(shí)數(shù)據(jù)流或大量數(shù)據(jù)時(shí)很常見(jiàn)。七、記錄(Log):記錄輸入數(shù)據(jù)流的關(guān)鍵信息,以便后續(xù)調(diào)試、審計(jì)或分析。這對(duì)于監(jiān)控系統(tǒng)行為和發(fā)現(xiàn)潛在問(wèn)題很有幫助。11.1.3輸出數(shù)據(jù)流輸出數(shù)據(jù)流(output

stream)是指只能寫(xiě)不能讀的流,用于從計(jì)算機(jī)中輸出數(shù)據(jù)。

與輸入流類似,java.io包中所有輸出數(shù)據(jù)流大多是從抽象類OutputStream繼承而來(lái),并且實(shí)現(xiàn)了其中的所有方法,這些方法主要提供關(guān)于數(shù)據(jù)輸出方面的支持。數(shù)據(jù)流的基本概念一、文件輸出流(FileOutputStream)二、字節(jié)數(shù)組輸出流(ByteArrayOutputStream)三、緩沖字符輸出流(BufferedWriter)流是單向的,輸入/出流只提供讀/寫(xiě)操作,即:只能從輸入流讀,向輸出流寫(xiě)。數(shù)據(jù)流的輸入與輸出如圖11-2所示:圖11-2數(shù)據(jù)流的輸入與輸出完整的流,需要有操控端、數(shù)據(jù)源/目標(biāo)。數(shù)據(jù)流的基本概念例11.1近些年來(lái),水污染越來(lái)越嚴(yán)重,小華一家出于對(duì)健康的考慮,準(zhǔn)備裝一套凈水系統(tǒng),喝純凈水,該如何處理?請(qǐng)?jiān)O(shè)計(jì)一個(gè)過(guò)程圖清晰的畫(huà)出自來(lái)水的處理過(guò)程(類比數(shù)據(jù)流的輸入與輸出)。設(shè)計(jì)圖如圖12-3所示:圖11-3家里想喝純凈水的過(guò)程注:水龍頭、水管等中沒(méi)有水(數(shù)據(jù)),即:流僅僅是對(duì)象間的數(shù)據(jù)傳輸通道。02二進(jìn)制I/O流和文本I/O流二進(jìn)制I/O流和文本I/O流11.2.1二進(jìn)制I/O流二進(jìn)制輸入輸出流是以字節(jié)為信息的基本單位。二進(jìn)制I/O流(BinaryInput/OutputStream)是用于讀寫(xiě)二進(jìn)制數(shù)據(jù)的一種數(shù)據(jù)流。在計(jì)算機(jī)中,所有的數(shù)據(jù)都以二進(jìn)制形式存儲(chǔ),而二進(jìn)制I/O流提供了一種機(jī)制,使得程序可以直接處理二進(jìn)制數(shù)據(jù),而不必關(guān)心數(shù)據(jù)的文本表示。在Java中,InputStream和OutputStream是用于處理字節(jié)流的基本抽象類。對(duì)于二進(jìn)制I/O,可以使用這兩個(gè)類及其子類來(lái)進(jìn)行操作。以下是一些常見(jiàn)的二進(jìn)制I/O類:一、FileInputStream和FileOutputStream:FileInputStream:用于從文件中讀取字節(jié)的輸入流。FileOutputStream:用于向文件中寫(xiě)入字節(jié)的輸出流。二進(jìn)制I/O流和文本I/O流//從文件讀取二進(jìn)制數(shù)據(jù)try(FileInputStreamfis=newFileInputStream("example.bin")){intdata;while((data=fis.read())!=-1){//處理二進(jìn)制數(shù)據(jù)}}catch(IOExceptione){e.printStackTrace();}//向文件寫(xiě)入二進(jìn)制數(shù)據(jù)try(FileOutputStreamfos=newFileOutputStream("example.bin")){//寫(xiě)入二進(jìn)制數(shù)據(jù)}catch(IOExceptione){e.printStackTrace();}二進(jìn)制I/O流和文本I/O流二、ByteArrayInputStream和ByteArrayOutputStream:BufferedInputStream:提供緩沖功能,用于從輸入流中高效讀取字節(jié)。BufferedOutputStream:提供緩沖功能,用于向輸出流中高效寫(xiě)入字節(jié)。//使用字節(jié)數(shù)組輸入流byte[]data={65,66,67,68};//對(duì)應(yīng)ASCII碼的'A','B','C','D'try(ByteArrayInputStreambais=newByteArrayInputStream(data)){intvalue;while((value=bais.read())!=-1){//處理二進(jìn)制數(shù)據(jù)}}catch(IOExceptione){e.printStackTrace();}//使用字節(jié)數(shù)組輸出流try(ByteArrayOutputStreambaos=newByteArrayOutputStream()){//寫(xiě)入二進(jìn)制數(shù)據(jù)byte[]newData=baos.toByteArray();//獲取寫(xiě)入的數(shù)據(jù)}catch(IOExceptione){e.printStackTrace();}二進(jìn)制I/O流和文本I/O流三、DataInputStream和DataOutputStream:DataInputStream:用于從輸入流中讀取基本數(shù)據(jù)類型的輸入流。DataOutputStream:用于向輸出流中寫(xiě)入基本數(shù)據(jù)類型的輸出流。//以基本數(shù)據(jù)類型(如int、double)的格式讀取數(shù)據(jù)try(DataInputStreamdis=newDataInputStream(newFileInputStream("data.bin"))){intintValue=dis.readInt();//讀取整數(shù)doubledoubleValue=dis.readDouble();//讀取雙精度浮點(diǎn)數(shù)}catch(IOExceptione){e.printStackTrace();}//以基本數(shù)據(jù)類型的格式寫(xiě)入數(shù)據(jù)try(DataOutputStreamdos=newDataOutputStream(newFileOutputStream("data.bin"))){dos.writeInt(42);//寫(xiě)入整數(shù)dos.writeDouble(3.14);//寫(xiě)入雙精度浮點(diǎn)數(shù)}catch(IOExceptione){e.printStackTrace();}二進(jìn)制I/O流和文本I/O流11.2.2文本I/O流文本I/O流是用于讀寫(xiě)文本數(shù)據(jù)的輸入輸出流。在許多編程語(yǔ)言中,文本I/O流提供了一種機(jī)制,使程序能夠以文本形式讀取和寫(xiě)入數(shù)據(jù)。這些流通常用于處理字符數(shù)據(jù),例如字符串。在Java中,以下是一些常見(jiàn)的用于文本I/O的類:一、FileReader和FileWriter:FileReader:用于讀取字符文件的字符輸入流。FileWriter:用于寫(xiě)入字符文件的字符輸出流。FileReaderreader=newFileReader("example.txt");FileWriterwriter=newFileWriter("output.txt");1.FileReader的常用方法:(1)構(gòu)造方法:FileReader(Filefile):使用指定的File對(duì)象創(chuàng)建一個(gè)新的FileReader。FileReader(StringfileName):使用指定的文件名創(chuàng)建一個(gè)新的FileReader。(2)讀取方法:intread():讀取單個(gè)字符。返回讀取的字符的ASCII值,如果到達(dá)文件末尾則返回-1。intread(char[]cbuf):將字符讀入數(shù)組。返回讀取的字符數(shù),如果到達(dá)文件末尾則返回-1。intread(char[]cbuf,intoff,intlen):將字符讀入數(shù)組的一部分。從數(shù)組的off位置開(kāi)始,最多讀len個(gè)字符。(3)關(guān)閉方法:voidclose():關(guān)閉該流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。在讀取完文件后,應(yīng)該及時(shí)關(guān)閉文件流。(注意:在使用FileReader時(shí),為了提高性能,通常會(huì)與BufferedReader配合使用。BufferedReader提供了緩沖機(jī)制,能夠一次讀取多個(gè)字符,減少了對(duì)磁盤(pán)的實(shí)際讀取次數(shù),從而提高了效率。)二進(jìn)制I/O流和文本I/O流以下是一個(gè)簡(jiǎn)單的例子,演示了如何使用FileReader從文件中讀取數(shù)據(jù):importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.IOException;publicclassFileReaderExample{publicstaticvoidmain(String[]args){try(FileReaderfileReader=newFileReader("example.txt");BufferedReaderbufferedReader=newBufferedReader(fileReader)){Stringline;while((line=bufferedReader.readLine())!=null){

//處理每一行的內(nèi)容System.out.println(line);}}catch(IOExceptione){e.printStackTrace();}}}//FileReader與BufferedReader結(jié)合使用,BufferedReader的readLine()方法用于逐行讀取文本文件。二進(jìn)制I/O流和文本I/O流2.FileWriter的常用方法:(1)構(gòu)造方法:FileWriter(Filefile):使用指定的File對(duì)象創(chuàng)建一個(gè)新的FileWriter。FileWriter(Filefile,booleanappend):使用指定的File對(duì)象創(chuàng)建一個(gè)新的FileWriter,并選擇是否追加寫(xiě)入。FileWriter(StringfileName):使用指定的文件名創(chuàng)建一個(gè)新的FileWriter。FileWriter(StringfileName,booleanappend):使用指定的文件名創(chuàng)建一個(gè)新的FileWriter,并選擇是否追加寫(xiě)入。(2)寫(xiě)入方法:voidwrite(intc):寫(xiě)入單個(gè)字符。voidwrite(char[]cbuf):寫(xiě)入字符數(shù)組的所有內(nèi)容。voidwrite(char[]cbuf,intoff,intlen):寫(xiě)入字符數(shù)組的一部分,從off位置開(kāi)始,最多寫(xiě)入len個(gè)字符。voidwrite(Stringstr):寫(xiě)入字符串的所有內(nèi)容。voidwrite(Stringstr,intoff,intlen):寫(xiě)入字符串的一部分,從off位置開(kāi)始,最多寫(xiě)入len個(gè)字符。(3)刷新和關(guān)閉方法:voidflush():刷新流,將緩沖區(qū)的數(shù)據(jù)寫(xiě)入文件。voidclose():關(guān)閉該流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。二進(jìn)制I/O流和文本I/O流以下是一個(gè)簡(jiǎn)單的例子,演示了如何使用FileWriter將數(shù)據(jù)寫(xiě)入文件:importjava.io.FileWriter;importjava.io.IOException;publicclassFileWriterExample{publicstaticvoidmain(String[]args){try(FileWriterfileWriter=newFileWriter("output.txt")){

//寫(xiě)入單個(gè)字符fileWriter.write('A');

//寫(xiě)入字符串fileWriter.write("Hello,FileWriter!");

//寫(xiě)入字符數(shù)組char[]charArray={'','W','o','r','l','d'};fileWriter.write(charArray);

//刷新并關(guān)閉流fileWriter.flush();}catch(IOExceptione){e.printStackTrace();}}}二進(jìn)制I/O流和文本I/O流二、BufferedReader和BufferedWriter:BufferedReader:提供緩沖功能,可以高效讀取字符輸入流。BufferedWriter:提供緩沖功能,可以高效寫(xiě)入字符輸出流。BufferedReaderbufferedReader=newBufferedReader(newFileReader("example.txt"));BufferedWriterbufferedWriter=newBufferedWriter(newFileWriter("output.txt"));三、PrintWriter:PrintWriter:繼承自Writer,提供了可以方便地寫(xiě)入各種數(shù)據(jù)類型的文本表示的方法。PrintWriterprintWriter=newPrintWriter("output.txt");四、BufferedInputStream和BufferedOutputStream:BufferedInputStream:提供緩沖功能,可以高效讀取字節(jié)輸入流。BufferedOutputStream:提供緩沖功能,可以高效寫(xiě)入字節(jié)輸出流。FileInputStreamfileInputStream=newFileInputStream("example.txt");FileOutputStreamfileOutputStream=newFileOutputStream("output.txt");五、BufferedInputStream和BufferedOutputStream:BufferedInputStream:提供緩沖功能,可以高效讀取字節(jié)輸入流。BufferedOutputStream:提供緩沖功能,可以高效寫(xiě)入字節(jié)輸出流。BufferedInputStreambufferedInputStream=newBufferedInputStream(newFileInputStream("example.txt"));BufferedOutputStreambufferedOutputStream=newBufferedOutputStream(newFileOutputStream("output.txt"));03節(jié)點(diǎn)流和處理流節(jié)點(diǎn)流和處理流一、基本概念(1)節(jié)點(diǎn)流可以從一個(gè)特定的數(shù)據(jù)源讀寫(xiě)數(shù)據(jù),如FileReader、Filewriter。(2)處理流(也叫包裝流)是“連接”在已存在的流(節(jié)點(diǎn)流或處理流)之上,為程序提供更為強(qiáng)大的讀寫(xiě)能力,如BufferedReader、Bufferedwriter。二、一覽圖如表11-2所示:

表11-2節(jié)點(diǎn)流和處理流一覽圖節(jié)點(diǎn)流和處理流三、節(jié)點(diǎn)流和處理流的區(qū)別和聯(lián)系1.節(jié)點(diǎn)流是底層流/低級(jí)流,直接跟數(shù)據(jù)源相接。2.處理流包裝節(jié)點(diǎn)流,既可以消除不同節(jié)點(diǎn)流的實(shí)現(xiàn)差異,也可以提供更方便的方法來(lái)完成輸入輸出。3.處理流(也叫包裝流)對(duì)節(jié)點(diǎn)流進(jìn)行包裝,使用了修飾器設(shè)計(jì)模式,不會(huì)直接與數(shù)據(jù)源相連。四、處理流的功能1.性能的提高:主要以增加緩沖的方式來(lái)提高輸入輸出的效率。2.操作的便捷:處理流可能提供一系列便捷的方法來(lái)一次輸入輸出大批量的數(shù)據(jù),使用更加靈活方便。節(jié)點(diǎn)流和處理流五、應(yīng)用案例例11.2:新年將至,小明想在前不久寫(xiě)給小華的文件中加入祝福語(yǔ)“新年快樂(lè)”,請(qǐng)使用FileWriter將“新年快樂(lè)”寫(xiě)入文件中。ChatGPT指令://使用FileWriter將“新年快樂(lè)”寫(xiě)入文件中。節(jié)點(diǎn)流和處理流例11.3在一個(gè)神奇的魔法世界中,李華和他的同伴踏入了一座莊嚴(yán)的文本文件城堡,這里珍藏著每位玩家的得分傳說(shuō)。他們需要通過(guò)魔法(即節(jié)點(diǎn)流和處理流)讀取得分?jǐn)?shù)據(jù)并進(jìn)行處理,再將數(shù)據(jù)重新寫(xiě)回卷軸(即文件)中。李華一行人成功完成了這場(chǎng)充滿冒險(xiǎn)與魔法的任務(wù),為這個(gè)神奇世界帶來(lái)了生機(jī)。請(qǐng)編寫(xiě)一段代碼描述上述這個(gè)有趣的魔法。ChatGPT指令://根據(jù)上述文字提示,運(yùn)用Java數(shù)據(jù)流知識(shí)編寫(xiě)一段代碼描述上述這個(gè)有趣的魔法。04序列化和反序列化序列化和反序列化一、序列化就是在保存數(shù)據(jù)時(shí),保存數(shù)據(jù)的值和數(shù)據(jù)類型二、反序列化就是在恢復(fù)數(shù)據(jù)時(shí),恢復(fù)數(shù)據(jù)的值和數(shù)據(jù)類型三、需要讓某個(gè)對(duì)象支持序列化機(jī)制,則必須讓其類是可序列化的,為了讓某個(gè)類是可序列化的,該類必須實(shí)現(xiàn)如下兩個(gè)接口之一:1.Serializable//這是一個(gè)標(biāo)記接口,沒(méi)有方法如例11.4所示:importjava.io.Serializable;publicclassMyObjectimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringname;privateintage;//構(gòu)造函數(shù)、getter和setter等方法省略}2.Externalizable//該接口有方法需要實(shí)現(xiàn),因此我們一般實(shí)現(xiàn)上面的Serializable接口序列化和反序列化注意事項(xiàng)和細(xì)節(jié)說(shuō)明:(1)讀寫(xiě)順序要一致。(2)要求序列化或反序列化對(duì)象,需要實(shí)現(xiàn)Serializable。(3)序列化的類中建議添加SerialVersionUID,為了提高版本的兼容性。(4)序列化對(duì)象時(shí),默認(rèn)將里面所有屬性都進(jìn)行應(yīng)列化,但除了static或transient修飾的成員。(5)序列化對(duì)象時(shí),要求里面屬性的類型也需要實(shí)現(xiàn)序列化接口。(6)序列化具留可繼永性,也就是如果某類已經(jīng)實(shí)現(xiàn)了序列化,則它的所有子類也已經(jīng)默認(rèn)實(shí)現(xiàn)了序列化。例11-5使用ObjectOutputStream將對(duì)象序列化為字節(jié)流:importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectOutputStream;publicclassSerializationExample{publicstaticvoidmain(String[]args){MyObjectmyObject=newMyObject();//設(shè)置對(duì)象屬性...try(ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("serialized_object.dat"))){oos.writeObject(myObject);System.out.println("Objecthasbeenserialized");}catch(IOExceptione){e.printStackTrace();}}}序列化和反序列化例11-6反序列化一個(gè)對(duì)象,使用ObjectInputStream從字節(jié)流中讀取對(duì)象:importjava.io.FileInputStream;importjava.io.IOException;importjava.io.ObjectInputStream;publicclassDeserializationExample{publicstaticvoidmain(String[]args){try(ObjectInputStreamois=newObjectInputStream(newFileInputStream("serialized_object.dat"))){MyObjectmyObject=(MyObject)ois.readObject();System.out.println("Objecthasbeendeserialized");//使用反序列化后的對(duì)象...}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}}}在例11-6中,類中的serialVersionUID字段是為了確保反序列化時(shí)的版本兼容性,如果類結(jié)構(gòu)發(fā)生變化,可以手動(dòng)指定一個(gè)serialVersionUID以避免反序列化失敗。05文件的處理文件的處理11.5.1File類文件的介紹:文件是保存數(shù)據(jù)的地方,比如常用的word文檔,txt文件,excel文件等它既可以保存一張圖片,也可以保存視頻,聲音等。在對(duì)一個(gè)文件進(jìn)行I/O操作之前,必領(lǐng)先獲得有關(guān)這個(gè)文件的基本信息,例如文件能不能被讀取,能不能被寫(xiě)入,絕對(duì)路徑是什么,文件長(zhǎng)度是多少等。類java.io.File提供了獲得文件基本信息及操作文件的一些工具。一、以下是創(chuàng)建一個(gè)新的File對(duì)象的構(gòu)造方法:1.通過(guò)路徑名創(chuàng)建:Filefile1=newFile("path/to/file.txt");2.通過(guò)父路徑和子路徑名創(chuàng)建:FileparentDir=newFile("parent/directory");Filefile2=newFile(parentDir,"file.txt");3.通過(guò)URI創(chuàng)建:Filefile3=newFile(newURI("file:///path/to/file.txt"));文件的處理二、創(chuàng)建File類的對(duì)象后,可以應(yīng)用其中的相關(guān)方法來(lái)獲取文件的信息:1.獲取文件名或路徑信息:Filefile=newFile("path/to/file.txt");//獲取文件名StringfileName=file.getName();//獲取文件路徑StringfilePath=file.getPath();//獲取文件的絕對(duì)路徑StringabsolutePath=file.getAbsolutePath();2.判斷文件是否存在:booleanexists=file.exists();3.判斷是否是文件或目錄:booleanisFile=file.isFile();booleanisDirectory=file.isDirectory();longfileSize=file.length();//返回文件的長(zhǎng)度(以字節(jié)為單位)4.獲取文件的大?。簂ongfileSize=file.length();//返回文件的長(zhǎng)度(以字節(jié)為單位)5.獲取文件的最后修改時(shí)間:longlastModified=file.lastModified();//返回文件最后修改時(shí)間的毫秒數(shù)6.獲取目錄中的文件和子目錄列表:String[]fileList=file.list();//返回目錄中的文件和目錄的名稱數(shù)組File[]files=file.listFiles();//返回目錄中的文件和目錄的`File`對(duì)象數(shù)組文件的處理例11.7使用FileInputStream和FileOutputStream,從一個(gè)文件讀取內(nèi)容并將內(nèi)容寫(xiě)入另一個(gè)文件:ChatGPT指令://使用FileInputStream和FileOutputStream,從一個(gè)文件讀取內(nèi)容并將內(nèi)容寫(xiě)入另一個(gè)文件在例11.7中,使用try-with-resources語(yǔ)句創(chuàng)建BufferedInputStream和BufferedOutputStream。這確保在完成文件操作后,它們會(huì)被自動(dòng)關(guān)閉。BufferedInputStream和BufferedOutputStream在內(nèi)部使用緩沖區(qū),提高了文件讀取和寫(xiě)入的性能。使用緩沖區(qū)循環(huán)讀取文件的內(nèi)容,并將讀取的數(shù)據(jù)寫(xiě)入輸出文件。這是一個(gè)常見(jiàn)的文件復(fù)制模式,其中inputStream.read(buffer)返回實(shí)際讀取的字節(jié)數(shù),而outputStream.write(buffer,0,bytesRead)寫(xiě)入相同數(shù)量的字節(jié)。文件的處理11.5.2隨機(jī)訪問(wèn)文件程序在讀寫(xiě)文件時(shí)常常不僅要能夠從頭讀到尾,還要能夠像訪問(wèn)數(shù)據(jù)庫(kù)那樣訪問(wèn)文本文件,到達(dá)一個(gè)位置讀一條記錄,到達(dá)另一位置讀另一條記錄,然后再讀另一條每次都在文件的不司位置進(jìn)行讀取。Java語(yǔ)言提供了類RandomAcceseFile來(lái)處理這種類型的輸入輸出。以下是創(chuàng)建隨機(jī)訪問(wèn)文件的兩種方法:一、使用文件名:主要涉及RandomAccessFile類。RandomAccessFile類允許你在文件中定位讀取或?qū)懭氲奈恢茫瑥亩鴮?shí)現(xiàn)對(duì)文

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論