版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第八章輸入輸出流
任務一:掌握流及標準輸入輸出
任務三:掌握常用文件和目錄操作
任務二:掌握常用輸入輸出流使用
任務四:實訓八文件輸入輸出操作實訓8.1
掌握流及標準輸入輸出
8.1.1流及其分類流是輸入/輸出設備的一種抽象表示,這些設備是數據源頭或是數據終點。Java應用程序可以從數據源讀取數據,向數據目的地寫入數據。流最簡單的分類:當向一個流寫入數據的時候,這個流被稱為輸出流。當從一個流讀取數據的時候,這個流被稱之為輸入流。流可以按流動方向,處理位置,功能等分類,詳細情況請看書上的表8-1圖8-1流是對輸入輸出設備一種抽象表示數據
數據程序輸入流輸出流輸入設備輸出設備說明:(1)首先,程序開發(fā)者可以使程序向流中寫入數據或者從流中讀出數據,你可以把它流想象成一個流入或流出你的程序的有序的數據序列;(2)其次,流必須連接到數據源或者數據目的地兩端的任何一端,你的應用程序可以通過流來向數據源讀取數據,或還可以通過流向數據目的地寫入數據,即流都有自己的起點和終點,并且是順序的。流是一個通道,通向數據源或者數據目的地;(3)要知道文件和流的差異。文件是一些具有永久存儲及特定順序的字節(jié)組成的一個有序的、具有名稱的集合。因此,對于文件,人們常會想到目錄路徑、磁盤存儲、文件名、文件和目錄名等方面。相反,流提供一種向后備存儲器寫入字節(jié)和從后備存儲器讀取字節(jié)的方式,后備存儲器可以為多種存儲媒介之一;(4)數據源或數據目的地,凡是可以存儲數據都可以作為前面兩者之一。
在編寫控制臺應用程序時,程序要讀取從鍵盤輸入的數據。那么程序是怎樣讀取從鍵盤輸入的數據呢?請看示例:【例8-1】從鍵盤按單個字節(jié)讀取數據。packagechapter08;publicclassReadNormalInputStreamByByte{ /** *程序8-1:按字節(jié)從鍵盤輸入中讀取數據 */ publicstaticvoidmain(String[]args)throwsException{ //從輸入流中讀取數據的下一個字節(jié),返回0到255范圍內的int字節(jié)值。 intb=System.in.read();//如果因為已經到達流末尾而沒有可用的字節(jié),則返回值-1 while(b!=-1){ System.out.println(b); b=System.in.read(); } }}8.1.2標準輸入流8.1.3標準輸出和標準錯誤1、標準輸出
在操作系統(tǒng)中定義的三個標準流中,另一個是標準輸出流,它同樣可以通過java的類System成員獲得。它對應于命令行的輸出,由封裝在System類的靜態(tài)out成員中且為PrintStream類型。 PrintStream類的主要寫數據的方法: print(dataTypedata)打印各種數據類型的值,dataType可以是Java的基本數據類型,也可以是字符數組、對象、字符串。 println(dataTypedata)打印各種數據類型的值,然后終止行。dataType可以是Java的基本數據類型,也可以是字符數組、對象、字符串。 printf(參數...)使用指定格式字符串和參數將格式化的字符串寫入此輸出流的便捷方法。write(intb)將指定的字節(jié)寫入此流。write(byte[]buf)將len字節(jié)從指定的初始偏移量為off的byte數組寫入此流。append(charch)將指定字符添加到此輸出流。 【例8-3】使用PrintStream流輸出各種數據類型。 packagechapter08; publicclassTestNormalOutputStream { publicstaticvoidmain(String[]args){ //輸出各種數據類型 System.out.println("HelloWorld!");//字符串 System.out.println(true);//布爾類型 System.out.println(23);//整型 System.out.println(123.3f); //浮點數 System.out.println();//換行 System.out.println(newchar[]{'7','8','9','4','5'});//字符數組 System.out.println('H');//字符類型 System.out.println(0x234);//十六進制整數 System.out.println(122.23d); //雙精度小數 System.out.println("你好!");//字符串 System.out.append('A');//字符 System.out.write(newbyte[]{1,2,3,4});//字節(jié)數組 System.out.flush();//刷新緩沖區(qū)的數據 } }2、標準錯誤
標準錯誤輸出流,在默認情況下它通常將錯誤信息映射到命令行輸出,由System類的err成員封裝,且也是PrintStream類型。Java的System類提供一些簡單的靜態(tài)方法調用,允許程序開發(fā)者對標準輸入、輸出、和錯誤流進行重定向: setIn(InputStreamin)----重新分配“標準”輸入流。 setOut(PrintStreamout)----
重新分配“標準”輸出流。 setErr(PrintStreamerr)----重新分配“標準”錯誤輸出流。 【例8-4】重定向方法的簡單使用。
主要代碼如下:
//獲取標準輸出流 PrintStreamconsole=System.out; //創(chuàng)建一個Redirecting.java文件輸入流,并對這個基本文件輸入流用 //BufferedInputStream流進行裝飾。 BufferedInputStreamin=newBufferedInputStream(newFileInputStream("src/chapter08/Redirecting.java")); //創(chuàng)建一個test.out文件輸出流,并對這個基本文件輸入流用 //PrintStream流進行裝飾。 PrintStreamout=newPrintStream(newFileOutputStream("test.out")); //重新定向標準輸入流 System.setIn(in); //重新定向標準輸出流 System.setOut(out); //重新定向標準錯誤入流
8.2任務二掌握常用輸入輸出流使用InputStream和OutStream類是所有字節(jié)輸入流和輸出流的基類。它們都是抽象類,不能被實例化,然而,這兩個類都聲明了一些方法,這些方法為它們所表示的流定義了操作的基本集合。它的子類對于讀取二進制的數據很有用途。Reader流和Writer流是能夠以字符流的方式讀寫字節(jié)流的對象,所以說字符流本質上就是一個讀或寫對象所面向的字節(jié)流。它們都是抽象類,不能被實例化,然而,這兩個類都聲明了一些方法,這些方法為它們所表示的流定義了讀寫字符的基本及相關操作集合。詳細的輸入輸出流的層次結構及其上面四個類的方法,請看教材。8.2.3FileInputStream類和FileOutStream類的使用FileInputStream類是文件輸入流,是從文件系統(tǒng)中的某個文件中獲得輸入字節(jié),主要針對讀取的二進制類型的文件的內容情況下使用它 在使用它時,必須先創(chuàng)建一個FileInputStream類的對象并且連接到數據源上,它提供了三個構造方法:publicFileInputStream(Filefile)通過打開一個到實際文件的連接來創(chuàng)建一個FileInputStream,該文件通過文件系統(tǒng)中的File對象file指定。publicFileInputStream(Stringname)通過打開一個到實際文件的連接來創(chuàng)建一個FileInputStream,該文件通過文件系統(tǒng)中的路徑名name指定。publicFileInputStream(FileDescriptorfdObj)通過使用文件描述符fdObj創(chuàng)建一個FileInputStream,該文件描述符表示到文件系統(tǒng)中某個實際文件的現有連接。在對流的相關操作結束后,一定要調用此方法關閉流,或者,應用程序或系統(tǒng)中有很多流打開的話,則耗資源。同樣,FileOutStream類是文件輸出流,是用于將數據寫入File或FileDescriptor的輸出流,主要針對寫入的二進制類型的文件的內容情況下使用它。在使用它時,必須先創(chuàng)建一個FileOutputStream類的對象并且連接到數據目的地上,它提供了五個構造方法?!纠?-5】簡單讀取文件:讀取Java應用程序的源代碼并正確顯示漢字。 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)//捕獲異常 { //將異常信息轉換為字符串 Stringerr=e.toString(); System.out.println(err);//輸出異常信息 } }}【例8-6】編寫一個復制文件的應用程序。代碼見教材
說明:創(chuàng)建一個輸入流fileIn連接到Sunset.jpg文件上和一個輸出流fileOut連接到Sunset1.jpg文件上,若Sunset1.jpg不存在,則會自動創(chuàng)建這個文件,如存在則會覆蓋這個文件。聲明一個1024長度的字節(jié)數組,每次從輸入流fileIn中當前位置startPos讀取1024個字節(jié)存放在buffer數組中,并把buffer數組的內容通過輸入流寫入到Sunset1.jpg文件中,把當前位置向后移動1024個字節(jié),重復操作直到到達Sunset.jpg文件末尾。要注意是:輸入輸出流的特點,是每個數據都必須等待排在它前面的數據讀入或送出之后才能讀寫,每次讀寫操作處理的是字節(jié)序列中剩余的未讀寫數據的第一個,而不能隨意選擇輸入輸出的位置,即讀寫數據是有序的。8.2.5FileReader類和FileWriter類使用可知,FileReader和FileWriter是按字符讀寫的輸入輸出流。它的基類是InputStreamReader和OutputStreamReader。在前面知道,InputStreamReader和OutputStreamWriter的基類分別是Reader和Writer,而Reader類和Writer類以及它們的子類并不是流本身,而是提供了以字符流的形式讀、寫底層流的方法。因此,Reader對象或者Writer對象通常使用底層的InputStream對象和OutputStream對象來創(chuàng)建,InputStream對象和OutputStream對象封裝有于外部設備的連接,這種外部設備就是最終的數據源或者數據目的地。要創(chuàng)建一個FileReader對象有三個方法,即它有三個構造函數分別如下:FileReader(File
file)在給定從中讀取數據的File的情況下創(chuàng)建一個新FileReader。FileReader(String
fileName)在給定從中讀取數據的文件名的情況下創(chuàng)建一個新FileReader。FileReader(FileDescriptor
fd)在給定從中讀取數據的FileDescriptor的情況下創(chuàng)建一個新FileReader。使用方法請看書上的三個示例8.2.6使用BufferedReader類實現各種數據類型的輸入BufferedReader從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取,并且可把讀出的內容轉換成各種數據類型。這樣,使用BufferedReader類可以實現各種數據類型的輸入。例如BufferedReader在讀取文本文件時,會先將字符數據讀入緩沖區(qū),而之后若使用read()方法時,會先從緩沖區(qū)中進行讀取,如果緩沖區(qū)數據不足,才會再從文件中讀取。使用BufferedWriter時,寫出的數據并不會先輸出至目的地,而是先儲存至緩沖區(qū)中,如果緩沖區(qū)中的數據滿了,才會一次對目的地進行寫出,例如一個目標文件,使用緩沖區(qū),同樣可以減少對磁盤的I/O動作,可以提高程序的寫數據的效率。這兩個來的主要方法在表8-8詳細使用方法請看書上的三個示例
8.3任務三掌握常用目錄和文件操作獲取文件信息和更改文件屬性創(chuàng)建File對象,File類提供了四種構造方法,分別是:publicFile(StringpathName)通過將給定路徑名字符串轉換為抽象路徑名來創(chuàng)建一個新File實例。publicFile(Fileparent,Stringchild)根據parent抽象路徑名和child路徑名字符串創(chuàng)建一個新File實例。publicFile(Stringparent,Stringchild)根據parent路徑名字符串和child路徑名字符串創(chuàng)建一個新File實例。publicFile(Stringuri)通過將給定的file:URI轉換為一個抽象路徑名來創(chuàng)建一個新的File實例。讀者要注意:File對象實際上并代表一個文件,File對象本身并不是物理文件或路徑,而是封裝了路徑名或引用,該引用是指向硬盤上可能存在也可能不存在的物理文件或目錄。所有創(chuàng)建File對象并不意味著文件或目錄就一定存在。并且File類的實例是不可變的;也就是說,一旦創(chuàng)建,File對象表示的抽象路徑名將永不改變。8.3.2列目錄文件清單列目錄文件清單的File類的File對象的方法:String[] list()返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。
String[] list(FilenameFilterfilter)返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。 File[] listFiles()返回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件。 File[] listFiles(FileFilterfilter)返回抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。 File[] listFiles(FilenameFilterfilter)返回抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。 8.3.3獲取根目錄和創(chuàng)建子目錄獲取根目錄和創(chuàng)建子目錄的File對象的方法:boolean mkdir()創(chuàng)建此抽象路徑名指定的目錄。 boolean mkdirs()創(chuàng)建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。 staticFile[] listRoots()列出可用的文件系統(tǒng)根。
上面表格中兩個對象方法、一個類方法,mkdir的功能是創(chuàng)建一個windows操作系統(tǒng)下的一個文件夾即目錄,mkdirs的功能是創(chuàng)建多個文件夾,但是必須創(chuàng)建的文件夾是要創(chuàng)建的文件夾及其不存在的所祖先文件夾。8.3.4文件的創(chuàng)建、更名和刪除創(chuàng)建、更名和刪除文件的File對象的方法:boolean createNewFile()當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創(chuàng)建一個新的空文件。 staticFile createTempFile(Stringprefix,Stringsuffix)在默認臨時文件目錄中創(chuàng)建一個空文件,使用給定前綴和后綴生成其名稱。 staticFile createTempFile(Stringprefix,Stringsuffix,Filedirectory)在指定目錄中創(chuàng)建一個新的空文件,使用給定的前綴和后綴字符串生成其名稱。 boolean renameTo(Filedest)重新命名此抽象路徑名表示的文件。 boolean delete()刪除此抽象路徑名表示的文件或目錄。 void deleteOnExit()在虛擬機終止時,請求刪除此抽象路徑名表示的文件或目錄。請認真閱讀一下【程序8-17】在當前目錄下創(chuàng)建、更名、刪除文件。并上機調試。 8.3.5基本數據類型數據的讀寫類DataInputStream是實現了DataInput接口,它允許應用程序以與機器無關方式從底層輸入流中讀取基本Java數據類型。如int、float、long、double和boolean等等。此外,DataInputStream的readUTF()方法還能讀取采用UTF-8字符編碼的字符串。DataInputStream類的所有讀方法采用了readXXX()模式。比如:
readByte()——從輸入流中讀取1個字節(jié),把它轉換為byte類型的數據。
readerLong()——從輸入流中讀取8個字節(jié),把它轉換為long類型的數據。readFloat()——從輸入流中讀取4個字節(jié),把它轉換為float類型的數據readUTF()——從輸入流中讀取1到3個字節(jié),把它轉換為采用UTF-8字符編碼的字符串。程序工作原理:對于以上文件輸入流,先用BufferedInputStream裝飾,在讀取數據時利用緩沖類裝飾以便提高讀取數據的效率,接著再用DataInputStream類裝飾,從而具備讀取格式化數據的功能。對于以上文件輸出流也是同樣的。以上程序輸出的結果為:
-21212中國8.3.6使用增加了緩沖的流類使用增加了緩沖的流類主要有:字節(jié)數組輸入流/輸出流(ByteArrayInputStream、ByteArrayOutputStream)和字符數組輸入流/輸出流(CharArrayReader、CharArrayWriter),這些類都包含一個受保護的成員變量----內部緩沖區(qū)數組,并且連接上數據源或數據目的地是一個字節(jié)或字符數組。 其中ByteArrayInputStream的成員變量protectedbyte[]buf的作用----由該流的創(chuàng)建者提供的byte數組,字節(jié)緩沖區(qū), 而ByteArrayOutputStream類的成員變量protectedbyte[]buf的作用----存儲數據的字節(jié)緩沖區(qū);
CharArrayInputStream的成員變量protectedchar[]buf的作用----字符緩沖區(qū),CharArrayOutputStream類也有一成員變量protectedchar[]buf的作用---存儲數據的字符緩沖區(qū)。 其中它的成員方法詳細情況,請看它們的基類字節(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,它是跟蹤行號的緩沖字符輸入流,其基類是BufferedReader。。它有兩個構造方法:publicLineNumberReader(Readerin)
使用默認輸入緩沖區(qū)的大小創(chuàng)建新的行編號reader,默認輸入緩沖區(qū)的大小為8096個字節(jié)。pulbicLineNumberReader(Readerin,intsize)
創(chuàng)建新的行編號reader,將字符讀入給定大小的緩沖區(qū)。 例如:
FileInputReaderin=newFileInputReader(“test.java”); LineNumberReaderlin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學護理學(護理倫理學)試題及答案
- 2025年大學中西醫(yī)結合(中西醫(yī)結合外科學)試題及答案
- 2025年中職無人機操控與維護(航拍技術)試題及答案
- 2025年大學歷史(歷史學學科研究)試題及答案
- 2025年大學公共事業(yè)管理(公共管理理論)試題及答案
- 2025年高職臨床醫(yī)學(耳鼻喉科診療)試題及答案
- 2025年中職歷史(歷史事件分析)試題及答案
- 2025年高職(大數據與會計)審計基礎與實務試題及答案
- 2025年中職漁業(yè)(水產養(yǎng)殖)試題及答案
- 2025年中職水文與水資源勘測(水文勘測)試題及答案
- 六性分析報告標準格式與范例
- 壓縮空氣儲能系統(tǒng)地下人工硐室技術及其評價技術研究
- 餐具分揀裝置的設計(機械工程專業(yè))
- 供水管網施工期間居民供水保障方案
- 江蘇省常州市鐘樓區(qū)小學語文三年級上冊期末檢測卷(含答案)
- 2025年縣司法局行政執(zhí)法協(xié)調監(jiān)督工作自查報告
- 醫(yī)院科室臺風應急預案
- 中職思政一年級“中國特色社會主義”期末考試試卷
- 創(chuàng)傷性血氣胸的護理常規(guī)
- 高血糖高滲患者疑難病例診療分析
- 2025至2030中國精釀啤酒行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
評論
0/150
提交評論