Java語言程序設計實用教程第十一講輸入輸出流_第1頁
Java語言程序設計實用教程第十一講輸入輸出流_第2頁
Java語言程序設計實用教程第十一講輸入輸出流_第3頁
Java語言程序設計實用教程第十一講輸入輸出流_第4頁
Java語言程序設計實用教程第十一講輸入輸出流_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Java語言程序設計實用教程第十一講輸入輸出流3本章學習要點:理解流,運用流進行I/O操作運用File類和RandomAccessFile類進行文件操作識別客戶/效勞器體系結構,理解網絡通信的機制,創(chuàng)立網絡應用效勞

流的概念流的概念Java用流的觀念來管理輸入輸出(I/O),流是一個很形象的概念,當程序需要讀取數(shù)據(jù)的時候,就會開啟一個通向數(shù)據(jù)源的流,這個數(shù)據(jù)源可以是文件,內存,或是網絡連接。類似的,當程序需要寫入數(shù)據(jù)的時候,就會開啟一個通向目的地的流。這時候就可以想象數(shù)據(jù)好似在這其中“流”動一樣字節(jié)流:在輸入輸出過程中以字節(jié)(8位單字節(jié))為單位(圖11-1)字符流:在輸入輸出過程中以字符(16位雙字節(jié))為單位(圖11-2)

在Java類庫中,IO局部的內容是很龐大的,因為它涉及的領域很廣泛:標準輸入輸出文件的操作網絡上的數(shù)據(jù)流字符串流對象流zip文件流流的應用Java中字節(jié)流由兩個抽象類來表示〔每種流包括輸入和輸出〕InputStream,OutputStream,Java中其他多種多樣變化的流均是由它們派生出來的字節(jié)流及派生Java中字符流由兩個抽象類來表示〔每種流包括輸入和輸出〕Reader,Writer,Java中其他多種多樣變化的流均是由它們派生出來的字符流及派生文件流:用于傳遞當前操作系統(tǒng)的某個文件內容管道流:用于多線程之間的通信過濾流:建立在其它流之上,完成暫存數(shù)據(jù)、統(tǒng)計數(shù)據(jù)、轉換數(shù)據(jù)類型等緩存流:構建內存緩沖區(qū),使得IO流的利用更高效…各種IO流的用途(P296,表11-1)標準輸入輸出標準輸入publicstaticfinalInputStreamin使用read()和skip〔longn〕方法讀取。標準輸出publicstaticfinalPrintStreamout使用print()和println()來輸出。標準錯誤輸出publicstaticfinalPrintStreamerr

文件操作File類〔p298,圖11-7〕File類的實例代表磁盤文件的對象File類只是描述文件對象的屬性,包括獲取文件的大小、是否讀寫、文件路徑、文件清單列表、新建目錄等目錄被作為一種文件來處理File類并不是文件流類,它不能從文件讀取數(shù)據(jù)或向文件寫入數(shù)據(jù)

例:創(chuàng)立一個目錄〔P299的創(chuàng)立目錄方法有誤〕Filefile=newFile("e:\\LeadWay"); booleana=file.mkdir(); if(a==true){ System.out.println("創(chuàng)立成功"); } else{ System.out.println("失敗"); }例:查看一個目錄下的文件

Filefile=newFile("目錄");1.StringfileName[]=file.list[file.length()];2.FilefileName[]=file.listFiles();然后用數(shù)組循環(huán)輸出

例如:Filedir=newFile("c:\\windows");StringfileName[]=dir.list();

for(inti=0;i<fileName.length;i++){System.out.println(fileName[i]);}文件的順序訪問引入“java.io”包,importjava.io.*;根據(jù)數(shù)據(jù)源和輸入輸出的任務建立字節(jié)或字符流。假設需要對字節(jié)或字符信息組織加工,位數(shù)據(jù)在已建字節(jié)或字符流對象上建立數(shù)據(jù)流或緩沖流。用輸入輸出流對象的成員方法進行讀/寫操作,需要時可設置指針位置。關閉流對象。2-5要考慮異常處理。文件輸入輸出字節(jié)流創(chuàng)立FileInputStream類對象;讀取文件信息;創(chuàng)立FileOutputStream類對象;向輸出流寫信息:voidwrite(intb);voidwrite(byteb[]);voidwrite(byteb[],intoff,intlen);關閉FileInputStream流。FileInputStream的read方法FileInputStream可以使用read()方法一次讀入一個字節(jié),并以int類型返回,或者是使用read()方法時讀入至一個byte數(shù)組,byte數(shù)組的元素有多少個,就讀入多少個字節(jié).在將整個文件讀取完成或寫入完畢的過程中,這么一個byte數(shù)組通常被當作緩沖區(qū),因為這么一個byte數(shù)組通常扮演承載數(shù)據(jù)的中間角色.publicintread(byte[]b,intoff,intlen)從此輸入流中將最多l(xiāng)en個字節(jié)的數(shù)據(jù)讀入一個字節(jié)數(shù)組中。參數(shù):b-存儲讀取數(shù)據(jù)的緩沖區(qū)。off-數(shù)據(jù)的起始偏移量。len-讀取的最大字節(jié)數(shù)。返回:讀入緩沖區(qū)的字節(jié)總數(shù),如果因為已經到達文件末尾而沒有更多的數(shù)據(jù),那么返回-1。FileOutputStream的構造方法FileOutputStream默認會以新建文件的方式來開啟流.如果指定的文件名稱已經存在,那么原文件會被覆蓋;如果想以附加的模式來寫入文件,那么可以在構建FileOutputStream實例時指定為附加模式.例如:FileOutputStreamfileOutputStream=newFileOutputStream(args[1],true);構建方法的第二個append參數(shù)如果設定為true,在開啟流時如果文件不存在那么會新建一個文件,如果文件存在就直接開啟流,并將寫入的數(shù)據(jù)附加至文件末端.例:使用文件輸入輸出字節(jié)進行文件拷貝方法publicstaticvoidmain(String[]args){try{byte[]buffer=newbyte[1024];//來源文件FileInputStreamfileInputStream=newFileInputStream(newFile(args[0]));//目的文件FileOutputStreamfileOutputStream=newFileOutputStream(newFile(args[1]));//available()可取得未讀取的數(shù)據(jù)長度("復制文件:"+fileInputStream.available()+"字節(jié)");

例:使用文件輸入輸出字節(jié)方法〔續(xù)1〕while(true){if(fileInputStream.available()<1024){//剩余的數(shù)據(jù)比1024字節(jié)少//一位一位讀出再寫入目的文件intremain=-1;while((remain=fileInputStream.read())!=-1){fileOutputStream.write(remain);}break;}else{//從來源文件讀取數(shù)據(jù)至緩沖區(qū)fileInputStream.read(buffer);//將數(shù)組數(shù)據(jù)寫入目的文件fileOutputStream.write(buffer);}}例:使用文件輸入輸出字節(jié)方法〔續(xù)2〕//關閉流fileInputStream.close();fileOutputStream.close();("復制完成");}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("using:javaFileStreamDemosrcdes");e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}例:使用文件輸入輸出字節(jié)方法的說明程序中示范了兩個read()方法,每次讀取之后,讀取的光標都會往前進,如果讀不到數(shù)據(jù)剛返回-1.:一個方法可以讀入指定長度的數(shù)據(jù)至數(shù)組另一個方法一次可以讀入一個字節(jié).使用available()方法可以獲得還有多少字節(jié)可以讀取.除了使用File來建立FileInputStream,FileOutputStream的實例之外,也可以直接使用字符串指定路徑來建立.如://來源文件FileInputStream

fileInputStream=newFileInputStream(args[0]);//目的文件FileOutputStream

fileOutputStream=newFileOutputStream(args[1]);文件輸入輸出字符流上面的FileInputStream使用字節(jié)讀取文件,字節(jié)流不能直接操作Unicode字符,所以Java提供了字符流.由于漢字在文件中占用2個字節(jié),如果使用字節(jié)流,讀取不當會出現(xiàn)亂碼現(xiàn)象,采用字符流就可以防止這個現(xiàn)象,因為,在Unicode字符中,一個漢字被看作一個字符.文件輸入輸出字符流(P300,例11-2)

FileReader和FileWriter是InputStreamReader和OutputStreamWriter的子類。構造方法各有兩種。FileReader(Filef)FileReader(Stringfn)FileWriter(Filef)FileWriter(Stringfn)常用方法:

read();read(char[]buffer);write(Stringstr);write(char[]buffer);文件的隨機訪問

輸入流FileInputStream和輸出流FileOutputStream,實現(xiàn)的是對磁盤文件的順序讀寫,而且讀寫要分別創(chuàng)立不同對象。相比之下RandomAccessFile類那么可對文件實現(xiàn)隨機讀寫操作。使用以下構造方法創(chuàng)立流,使用路徑名的字符串或使用File類的對象作為參數(shù),mode的取值為”r”或”rw”:RandomAccessFile(Stringname,Stringmode);RandomAccessFile(Filename,Stringmode);RandomAccessFile對象操作一個文件時,能夠在指定的位置以原始數(shù)據(jù)類型讀取或寫入數(shù)據(jù),例:當寫入一個int類型的值時,四個字節(jié)的數(shù)據(jù)輸出到文件當讀取一個double類型的值時,8個字節(jié)的數(shù)據(jù)從文件輸入RandomAccessFile對象的指針規(guī)律新建RandomAccessFile對象的文件位置指針位于文件的開頭處;每次讀寫操作之后,文件位置的指針都相應后移到讀寫的字節(jié)數(shù);可以通過getFilePointer方法來獲得文件當前指針的位置,默認為0通過seek方法來設置文件指針的位置。RandomAccessFile的其它方法(P301,例11-3)Intread()從文件當前位置讀取一個字節(jié)intread(byte[]b)intread(byte[]b,int

off,int

len)FinalcharreadChar()從文件中讀取2個字節(jié)Finalint

readInt()從文件中讀取4個字節(jié)FinalStringreadLine()從文件中讀取一行后轉為StringVoidwrite(byte[]b)將字節(jié)數(shù)組B中的數(shù)據(jù)寫到文件中Voidwrite(byte[]b,int

off,int

len)將

len

個字節(jié)從指定字節(jié)數(shù)組寫入到此文件,并從偏移量off處開始Voidwrite(intb)將指定的數(shù)據(jù)寫到文件中。FinalvoidwriteChar(intv)將char值按2個字節(jié)寫入到文件中FinalvoidwriteChars(Strings)將字符串按字符方式寫入到文件中FinalvoidwriteInt(intv)按四個字節(jié)將int

寫入該文件,先寫高字節(jié)…SequenceInputStream類SequenceInputStream類表示將其他輸入流的邏輯串聯(lián)。它從輸入流的有序集合開始,并從第一個輸入流開始讀取,直到到達文件末尾,接著從第二個輸入流讀取,依次類推,直到到達包含的最后一個輸入流的文件末尾為止。SequenceInputStream的構造器使用,一對輸入流或者一個輸入流的枚舉作為參數(shù):SequenceInputStream(InputStream

first,InputStreamsecond)SequenceInputStream(Enumeration

streamEnum)Enumeration接口提供了枚舉集合對象中所有對象的功能。為一個快要過時的接口,枚舉時建議使用Iterator。hasMoreElements()方法用來判斷Enumeration接口中是否還有元素,返回一個boolean值。

輸入輸出流的典型操作典型的幾種輸入輸出流節(jié)點流:讀或者寫到特定位置〔如磁盤文件、內存或網絡〕的輸入輸出流。FileInputStream和FileOutputStream是讀入或寫出數(shù)據(jù)到磁盤文件的節(jié)點流ByteArrayInputStream和ByteArrayOutputStream是讀入或寫出數(shù)據(jù)到內存的結點流ObjectInputStream和ObjectOutputStream是讀入或寫出數(shù)據(jù)到網絡的節(jié)點流過濾流:從一個流讀入數(shù)據(jù),然后寫到另一個流。本質是建立在已存在的流之上,通過對數(shù)據(jù)的處理提供較強大的讀寫功能。過濾流又可細分為緩沖流、轉換流、數(shù)據(jù)流、打印流、對象流等標準鍵盤的輸入處理System.in是InputStream類型,直接以字節(jié)流的方式讀入數(shù)據(jù)需要以字符流的方式時,需要將字節(jié)流轉換為Unicode字符流??梢允褂肐nputStreamReader類完成這樣的功能。為了提高效率,將鍵盤輸入的數(shù)據(jù)讀到BufferedReader類的對象中,實現(xiàn)緩沖功能,例如:BufferedReaderreader=newBufferedReader(new

InputStreamReader(System.in));緩沖類的使用舉例publicstaticvoidmain(Stringargs[]){try{//緩沖System.in輸入流BufferedReaderbufReader=newBufferedReader(newInputStreamReader(System.in));//緩沖FileWriter字符輸入流BufferedWriterbufwriter=newBufferedWriter(newFileWriter(args[0]));Stringinput=null;//每讀一次進行一次寫入動作while(!(input=bufReader.readLine()).equals("quit")){bufwriter.write(input);//newline()方法寫入與操作系統(tǒng)相依的換行字符bufwriter.newLine();}bufwriter.flush();bufwriter.close();

緩沖類的使用舉例〔續(xù)〕}catch(ArrayIndexOutOfBoundsExceptione){("沒有找到指定文件");}catch(IOExceptione){e.printStackTrace();}}實現(xiàn)P304,例11-5說明假設想對InputStream和OutputStream進行字符處理,可以使用java.io.InputStreamReader和java.io.OutputStreamWriter為其加上字符處理的功能,它們分別為Reader和Writer的子類舉個例子來說,假設想要顯示純文本文件的內容,不用費心地自行判斷字符編碼,只要將InputStream、OutputStream的實例作為構建InputStreamReader、OutputStreamWriter時的變量,就可以操作InputStreamReader和OutputStreamWriter來進行文本文件的讀取,讓它們?yōu)槟鲎址袛嗯c轉換的動作

網絡效勞客戶/效勞器體系結構在設計上把數(shù)據(jù)的表示與其內部的處理和存儲分開客戶端請求效勞,效勞器提供效勞客戶發(fā)送的請求由網絡發(fā)送給效勞器,效勞器響應請求處理完畢后,其結果經過網絡發(fā)送給客戶端。一個效勞器可以給多個客戶端提供效勞。瀏覽器和Web效勞器就是典型的客戶/效勞器結構〔P1191,圖11-9〕瀏覽器發(fā)出瀏覽某個網址網頁的請求Web效勞器將HTML網頁發(fā)送給客戶端瀏覽器通信協(xié)議計算機之間的通信,如同人與人之間的交流,需要雙方遵守相應的語言規(guī)那么TCP/IP:傳輸控制協(xié)議,用于不可靠的互聯(lián)網上提供可靠的端到端的字節(jié)流通信。其中TCP用于傳輸層,需要確定端口號;IP用于網絡層,需要確定IP地址。一個網絡效勞器是通過IP地址和端口號訪問的。UDP:面向非連接的用戶數(shù)據(jù)包協(xié)議,它提供了發(fā)送封裝的原始IP數(shù)據(jù)報的方法,并且發(fā)送時無需建立連接Internet服務

端口號Internet服務端口號FTP21WWW80TELNET23NNTP119DNS53POP3110(備注:NNTP---網絡新聞傳輸協(xié)議)

常見的一些internet效勞對應的端口號所謂Socket通常也稱為”套接字”,由IP地址和端口號有兩局部組成,應用程序通過“套接字”所提供的一組API向網絡發(fā)出請求或者應答網絡請求。ServerSocket類和Socket類位于包中。ServerSocket類用于效勞器建立監(jiān)聽套接字,Socket類用于客戶機建立套接字對象進行通信。例如,把套接字連接想象為一個呼叫,當呼叫完成后,談話的任何一方都可以隨時講話。但是在最初建立呼叫時,必須有一方呼叫,而另一方那么監(jiān)聽鈴聲。這樣,呼叫的一方為“客戶”,負責監(jiān)聽的一方是“效勞器”。套接字客戶機/效勞器〔C/S〕模式是在網絡應用程序中最常用的通信模式。在C/S模式通信過程中主動發(fā)起通信的一方被稱為客戶機,而監(jiān)聽并接受請求進行通信的一方成為效勞器。效勞器使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定〔由于1024以下的端口通常屬于保存端口,所以一般使用大于1024的端口〕,等待客戶端連接請求,客戶端連接后,會話產生,在完成會話后,關閉連接。客戶機/效勞器〔C/S〕模式的原理創(chuàng)立效勞器端ServerSocket,設置建立連接的端口號。創(chuàng)立客戶端Socket對象,設置綁定的主機名或IP地址,指定連接端口號。ServerSocket類的accept方法使效勞器處于阻塞狀態(tài),等待用戶請求客戶機Socket發(fā)起連接請求。建立連接取得InputStream和OutputStream。利用InputStream和OutputStream進行數(shù)據(jù)傳輸。關閉Socket和ServerSocket。利用Socket方式進行數(shù)據(jù)通信與傳輸?shù)闹饕襟E創(chuàng)立效勞器(端口號)定義數(shù)據(jù)成員效勞器等待網絡連接建立socket流讀客戶端信息向用戶發(fā)出一個字符串創(chuàng)立Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(接收并顯示)送用戶名給效勞器關閉流waitingforuser11111111login:connetctingclient...java提示用戶登錄成功讀socket流User:javaLoginsuccessfulSocket中的成員方法構造方法getInputStream():返回該socket所對應的輸入流getOutputStream():返回該socket所對應的輸出流

構造方法功能說明ServerSocket(intport)在指定的端口創(chuàng)建一個ServerSocket對象

ServerSocket(intport,intcount)在指定的端口創(chuàng)建一個ServerSocket對象并說明服務器所能支持的最大鏈接數(shù)

Socket(InetAddressaddress,intport)使用指定地址和端口創(chuàng)建一個Socket對象

Socket(InetAddressaddress,intport,booleanstream)使用指定地址和端口創(chuàng)建一個Socket對象(若布爾數(shù)值為true,則是采用流式通信方式)Socket(Stringhost,intport)使用指定主機和端口創(chuàng)建一個Socket對象Socket(Stringhost,intport,booleanstream)使用指定主機和端口創(chuàng)建一個Socket對象(若布爾數(shù)值為true,則是采用流式通信方式)

ServerSocket類/Socket類的構造方法ServerSocket對象和Socket對象〔1〕創(chuàng)立一個ServerSocket對象就創(chuàng)立了一個監(jiān)聽效勞,例如要創(chuàng)立一個指定端口的ServerSocket對象。ServerSocketListen=newServerSocket(4321);設置指定的監(jiān)聽端口4321,由于一臺效勞器可以監(jiān)聽多臺客戶機,而對于不同的效勞請求之間是根據(jù)端口號來區(qū)別的?!?〕創(chuàng)立一個Socket對象用于與效勞器建立鏈接,使用指定的端口號使得效勞器在捕獲到客戶端的請求時,根據(jù)端口號來完成給定的效勞。Socketservice=newSocket(“Emailserver”,4321);其中“Emailserver”是指欲連接效勞器的主機的地址,4321是指效勞器上提供效勞的端口號。import;import;import;publi

溫馨提示

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

評論

0/150

提交評論