第8章JSP中的文件操作_第1頁
第8章JSP中的文件操作_第2頁
第8章JSP中的文件操作_第3頁
第8章JSP中的文件操作_第4頁
第8章JSP中的文件操作_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第8章章 JSP中的文件操作中的文件操作 文件可以永久地存儲信息,從本質上講文件就是存放在盤上的一系列數(shù)據的集合。應用程序如果想長期保存數(shù)據,就必須將數(shù)據存儲到文件中,這就涉及到文件的操作。而在編寫網站應用程序的過程中,有許多地方要對文件進行操作。本章將要對JSP中文件操作的應用作一些介紹,如讀寫文件、上傳下載文件、創(chuàng)建刪除目錄等。本章學習目標本章學習目標 了解JSP中的數(shù)據流。 了解File類。 掌握文件相關的操作,如讀寫、上傳、下載文件和創(chuàng)建刪除目錄等。 了解使用jspsmartupload上傳包。8.1 數(shù)據流和數(shù)據流和File類類 數(shù)據從一個輸入源獲得。程序的結果被送到輸出目的地。這

2、些源和目的地被廣泛地定義。例如一個網絡連接器,內存緩沖區(qū)或磁盤文件可以被輸入/輸出類熟練地操作,這些外設都由相同的抽象體流(stream)來處理。流,是一個生產或消費信息的邏輯實體。流通過輸入/輸出系統(tǒng)與物理設備相連。盡管與之相連的實際的物理設備各不相同,所有的流都以同樣的方式運轉。 JSP定義了兩種數(shù)據流:字節(jié)流和字符流。 字節(jié)流:為處理字節(jié)式輸入/輸出提供了豐富的環(huán)境,其處理單元為1個字節(jié),操作字節(jié)和字節(jié)數(shù)組。 InputStream:抽象類是表示字節(jié)輸入流的所有類的超類。 需要定義 InputStream 的子類的應用程序必須始終提供返回下一個輸入字節(jié)的方法。 OutputStream:

3、此抽象類是表示輸出字節(jié)流的所有類的超類。輸出流接受輸出字節(jié)并將這些字節(jié)發(fā)送到某個接收器。 需要定義 OutputStream 子類的應用程序必須始終提供至少一種可寫入一個輸出字節(jié)的方法。 一個字節(jié)流可以和其他任何類型的對象并用,包括二進制數(shù)據。這樣的多功能性使得字節(jié)流對很多類型的程序都很重要。字節(jié)流以InputStream和OutputStream為頂層。InputStream(輸入流)是一個定義了流式字節(jié)輸入模式的抽象類,該類的所有方法在出錯條件下引發(fā)一個IOException異常。OutputStream(輸出流)是定義了流式字節(jié)輸出模式的抽象類,該類的所有方法返回一個void值并且在出錯

4、情況下引發(fā)一個IOException異常。 字符流:提供了處理任何類型輸入/輸出操作的足夠的功能,字符流處理的單元為2個字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串。 Reader:用于讀取字符流的抽象類。 子類必須實現(xiàn)的方法只有 read(char, int, int) 和 close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。用于讀取字符流的抽象類。 Writer :寫入字符流的抽象類。 子類必須實現(xiàn)的方法僅有 write(char, int, int)、flush() 和 close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效

5、率和/或其他功能。 字符流以Reader和Writer為頂層。Reader是定義Java的流式字符輸入模式的抽象類,該類的所有方法在出錯情況下都將引發(fā)IOException異常。Writer是定義流式字符輸出的抽象類,所有該類的方法都返回一個void值并在出錯條件下引發(fā)IOException異常。8.1.2 File類類 File類 文件和目錄路徑名的抽象表示形式。 用戶界面和操作系統(tǒng)使用與系統(tǒng)相關的路徑名字符串 來命名文件和目錄。此類呈現(xiàn)分層路徑名的一個抽象的、與系統(tǒng)無關的視圖。抽象路徑名 有兩個組件: 一個可選的與系統(tǒng)有關的前綴 字符串, 比如盤符,“/” 表示 中的根目錄, 表示 Mic

6、rosoft Windows UNC 路徑名,以及 零個或更多字符串名稱 的序列。 File類:用于文件系統(tǒng)操作的類 Java內建的用來操作文件目錄的類File,該類提供新增、刪除與修改等操作文件相關功能所需的方法成員。 File類沒有指定信息怎樣從文件讀取或向文件存儲; 它描述了文件本身的屬性。 File對象用來獲取或處理與磁盤文件相關的信息,例如權限、時間、日期和目錄路徑。另外,F(xiàn)ile還瀏覽子目錄層次結構??梢杂脕砩蒄ile對象的構造函數(shù)如下。File(String directoryPath)File(String directoryPath,String filename)File

7、(File dirObj,String filename)其中,directoryPath是文件的路徑名,filename是文件名,dirObj是一個指定目錄的File對象。第一個構造函數(shù)通過全路徑路徑文件名來創(chuàng)建對象,pathname可以是絕對路徑也可以是相對路徑。第二個構造函數(shù)通過父目錄和文件名來創(chuàng)建對象,filename是不含路徑的文件名。第三個構造函數(shù)也是通過父目錄和文件名來創(chuàng)建對象,但父目錄由一個File對象提供。注意:文件的路徑有兩種形式,即絕對路徑和相對路徑。絕對路徑包含它所指定的文件的完整路徑信息,根據絕對路徑就可以惟一定位一個文件。而相對路徑是針對“其他某個路徑”而言的,這個

8、路徑和相對路徑共同定位一個文件的位置。 File類位于命名空間java.io,因此在JSP網頁使用File類之前,必須利用以下的程序代碼,將此命名空間載入: 表8-1 File類的屬性方方 法法說說 明明isDirectory()返回一個布爾值,返回一個布爾值,true表示為目錄,表示為目錄,false則表示是文件,借則表示是文件,借以判斷以判斷File對象所參考的路徑是否為目錄對象所參考的路徑是否為目錄isFile()返回一個布爾值,返回一個布爾值,true表示為文件,表示為文件,false則表示是目錄,借則表示是目錄,借以判斷以判斷File對象所參考的路徑是否為文件對象所參考的路徑是否為文

9、件canRead()返回布爾值,返回布爾值,true表示此為允許讀取的文件表示此為允許讀取的文件canWrite()返回布爾值,返回布爾值,true表示此為允許寫入的文件表示此為允許寫入的文件exists()返回一個布爾值,返回一個布爾值,true表示參考的文件目錄存在表示參考的文件目錄存在getName()取得取得File對象所參考的路徑底下的目錄或文件名稱對象所參考的路徑底下的目錄或文件名稱getPath()取得取得File對象所參考的路徑字符串對象所參考的路徑字符串toString()將將File對象轉換成為以字符串類型的名稱表示對象轉換成為以字符串類型的名稱表示equals()比較兩個

10、比較兩個File對象是否相等對象是否相等 由于File對象本身僅僅只是參考一個特定的路徑,因此上述的路徑及文件參數(shù)也可能代表一個不存在的文件,在進行文件的操作之前,可以利用exists方法,查看文件是否存在,以判斷是否進行相關的文件操作,這一點非常重要,若是嘗試存取一個不存在的文件,會讓系統(tǒng)產生一個錯誤的例外對象。 【例8-1】下面的范例演示一個查看文件相關性質的JSP網頁實例。查看文件內容(usingFile.jsp) 一般文件的維護操作包含了新增、刪除及列舉等操作,F(xiàn)ile類本身也提供了相關功能的方法成員,列舉如表8-2所示。 表8-2 文件維護方法方 法說 明createNewFile(

11、)創(chuàng)建一個新文件delete()刪除指定的文件renameTo()重新命名文件setReadonly將文件對象所參照的文件設為只讀mkdir()建一指定的目錄mkdirs()建立指定路徑底下的所有目錄 1. 創(chuàng)建文件與目錄文件夾創(chuàng)建文件與目錄文件夾 File類提供一個名稱為createNewFile()的方法成員,用以建立File對象參數(shù)所指定的文件,以下為引用此方法的程序代碼范例片段: bool blCreate = myFile.createNewFile() ; 由于createNewFile()返回一個布爾值,因此必須利用聲明為boolean類型的變量存儲運行結果,若是上式blCrea

12、te結果值為true,表示文件建立成功;若是false則表示文件建立失敗,并且返回一個IOException例外對象,這個情形通常發(fā)生在指定的目錄底下已經存在所要建立的文件,因此在建立文件之前查看其是否存在是非常重要的操作。File類另外提供建立目錄的方法成員mkdir,同樣的我們必須利用File類的實體對象引用這個方法以建立指定的目錄,例如以下的程序代碼File myFile = new File(pathName) ; bool blMK = myFile.mkdir() ; 其中的返回值意義同上述CreateNewFile方法,這里必須注意的是,由于引用這個方法所要建立的是一個目錄,因此

13、第1行程序代碼中所指定的參數(shù)值必須是一個路徑而非文件,同時指定建立的目錄其上層目錄的路徑必須是存在的,例如下面的程序代碼:boolean blNew ;File myDir = new File(C:/testDir/newDir) ;blNew = myDir.mkdir() ;其中mkdir()在C:/testDir目錄下建立一個新的目錄newDir,前提是C:/testDir目錄必須存在,否則建立目錄的作業(yè)將會失敗。 另外一個類似mkdir()的方法為mkdirs(),這個方法不同的地方在于若是指定的目錄路徑不存在,則整個目錄結構均將被創(chuàng)建,例如以下的程序代碼: File myMkDir

14、s = new File(C:/firstDir/secondDir/thirdDir) ; blNew = myMkDirs.mkdirs() ; 當網頁運行該段程序代碼的時候,其中C:/firstDir/secondDir/thirdDir這個路徑的文件夾以及子文件夾,都會被建立。2. 刪除文件與目錄數(shù)據夾刪除文件與目錄數(shù)據夾刪除文件或者是目錄非常容易,只要引用File類所提供的方法成員delete() 即可。這個方法將會刪除File對象本身所代表的文件或是目錄,也就是建立File對象,指定路徑底下的文件,或是建立對象時所輸入的特定目錄路徑參數(shù)。delete方法有一個布爾類型的返回值,若是

15、成功刪除指定刪除文件,則返回值為true,當指定的文件不存在,或是指定的文件刪除失敗,則返回值為false。另外必須特別注意的是,delete方法只能刪除空目錄,若是目錄底下存在任何文件或是子目錄,刪除的操作會失敗,并且返回一個代表刪除目錄失敗的false布爾值。8.2 讀寫文本文件讀寫文本文件 操作文件主要有兩種類型,一種是讀取內容,一種是寫入內容或者更改文件的屬性。下面分別討論。 讀取文件內容 在讀取文件時,可以有兩種選擇方式,一種是通過ServletContext讀取,另一種是直接使用java.io.FileReader等對象。前者只能讀取Servlet上下文中的文件,后者可以讀取任何位

16、置的文件。 例使用ServletContext讀取文件readFile.jsp 在ServletContext接口中,定義了一個java.io.InputStream getResourceAsStrem(java.lang.String path)方法來訪問給定的資源。這里的path參數(shù)必須以“/”開始(在根目錄下)。 一旦獲得了InputStream,我們就可以通過這個輸入劉讀取資源。 由于使用InputStream對象,如果在讀取后不對字符進行重新編碼,那么對中文將出現(xiàn)亂碼問題。而且沒有使用緩沖的輸入流,它的效率較低。 使用帶緩沖區(qū)的輸入流讀取文件資源。例如readFile2.jsp 使

17、用FileReader讀取文件資源。例readFile3.jsp 使用一個BufferReader封裝FileReader,這樣可以每次讀取一行數(shù)據。 寫入內容到文件writeFile.jsp PrintWriter類用來將格式化對象打印到一個文本輸出流,實現(xiàn)PrintStream中的所有打印方法,其使用方法和讀取二進制文件中的BufferedReader類似。在上邊的這段代碼中,每次向該二進制文件中寫入的新內容都會將原來的內容覆蓋,如果不想覆蓋原來的內容,可以修改如下代碼。 PrintWriter writer=new PrintWriter(new BufferedWriter(new F

18、ileWriter(“d:book.java,true); 即在創(chuàng)建PrintWriter對象時,添加一個參數(shù)true,這樣每次向二進制文件內寫入新的內容時,就會追加到原來的內容后面。 讀寫文件是文件操作最基本的內容。 讀寫文本文件所需的功能,主要由2個類所提供:FileWriter()及FileReader()。 FileReader()則用以讀取文件中的數(shù)據。 語法如下:FileReadermyFileReader= new FileReader(strFileName) ; 必須輸入指定操作的文件完整路徑名稱或是File對象 FileReadermyFileReader= new Fil

19、eReader(objFile) ; FileWriter()負責將數(shù)據寫入文件 語法如下:FileWriter myFileWriter = new FileWriter(fileName ) 將數(shù)據寫入文本文件之前,首先必須建立FileWriter對象,同時傳入所要操作的文件完整路徑名稱字符串, FileWriter myFileWriter = new FileWriter(myFile ) 【例8-2】一個讀寫文本文件的例子readwrite.jsp, 首先創(chuàng)建一個test.txt文件,并寫入幾句話, 然后再讀取文件中的數(shù)據,并且把它們顯示到瀏覽器里 8.3 文件的瀏覽文件的瀏覽 【例

20、8-3】瀏覽當前目錄中文件與子目錄的例子browserFile.jsp,例子執(zhí)行后,會在瀏覽器中輸出當前目錄中的所有文件和子目錄,并對文件和子目錄進行統(tǒng)計。 8.4 創(chuàng)建和刪除目錄創(chuàng)建和刪除目錄 【例8-4】有關目錄的創(chuàng)建與刪除的例子Directory.jsp。 1. 2. 3. 文件的上傳和下載文件的上傳和下載 【例8-5】 在這里我們寫一個簡單的頁面uploadfile.jsp,提供一個表單,用戶從這里選擇文件并把文件上載到服務器。 jspSmartUpload雖然好用,但是提供此包下載的網站已經關閉,您將無法從網站上得到。因此本節(jié)還要介紹另外一個被廣泛使用的上傳包,M

21、ultipartRequest,這是由OReilly所開發(fā)的免費軟件,可到下面的網址中下載使用。 http:/ com.oreilly.servlet首頁,如圖所示。來到這個網頁的時候,將畫面往下拉,在Download區(qū)域單擊cos-05Nov2002.zip文件的下載連接,選擇存儲路徑,完成下載操作。8.6 使用使用OReilly上傳包上傳包解壓下載后的文件,將classes文件夾里面的整個com目錄,復制一份到范例根目錄下的classes文件夾下,緊接著我們便可以進一步使用制作文件上傳功能網頁。MultipartRequest在使用之前首先必須在JSP網頁中將其載入,其包名稱如下:com.

22、oreilly.servlet.MultipartRequestMultipartRequest的使用非常簡單,只要在網頁中建立其對象,便能夠完成上傳操作。建立MultipartRequest的方式非常多,以下為其中比較普遍的一種:MultipartRequest theMultipartRequest = new MultipartRequest(request,path,fileSize) 上面這段程序代碼使用關鍵字new建立1個MultipartRequest對象theMultipartRequest,其中第2行為MultipartRequest的建立方式,它接收3個參數(shù),第1個為req

23、uest對象,包含表單所要傳遞的上傳文件信息,第2個參數(shù)為文件上傳之后的存儲路徑,第3個參數(shù)則是所要限制的上傳文件大小。 當這段程序代碼在網頁當中被運行的時候,表單上所指定的文件將會被上傳至服務器指定的位置進行保存。 MultipartRequest的使用方式與SmartUpload有相當大的差異,上傳文件相關信息的獲得,必須以傳送的表單屬性為依據方 法說 明getFileNames()取 得 包 含 所 有 文 件 上 傳 文 件 名 稱 的Enumeration對象getFilesystemName(fieldName)取得文件名名稱getContentType(fieldName)取得文件名類型getFile(fieldNa

溫馨提示

  • 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

提交評論