java學(xué)習(xí)第八周總結(jié)(2) ---流、JFileChooser 這兩天主要學(xué)習(xí)內(nèi)容是java的I/O操作。I/O(輸入/輸出)是每個程序必須具備的。因此這個知識點也是作為一名程序員必須掌握的,由此可見它的重要性。雖然我們學(xué)習(xí)java1個多月以來,今天才開始正式的接觸到I/O,但是之前我們的程序中也或多或少使用到了它,只是那個時候?qū)λ母拍钸€比較模糊而已。也正式由于它的重要性,因此它所涉及的面也非常的廣,對于我們這些初學(xué)java的程序員來說要全面,透徹的了解它和掌握它也不大可能。學(xué)習(xí)本來就是一個循序漸進的過程,切忌好高騖遠(yuǎn)。要腳踏實地,不斷的發(fā)現(xiàn)問題、解決問題,積累經(jīng)驗,這樣才能更深刻地理解和掌握這一門語言,而不僅僅是熟練,或者所謂的精通某某技術(shù)。 今天主要總結(jié)兩點:流(Stream)的概念和JFileChooser的用法。再深入點的內(nèi)容我也僅僅只有點概念性的東西,沒能完全理解,只有在今后不斷實踐中再總結(jié)經(jīng)驗。 一、流(Stream) 2、為什么需要流 3、什么地方需要使用流 4、怎樣建立流 (1)基于字節(jié)輸入輸出,如InputStream/OutputStream 由上面可以看出,基本上針對字節(jié)操作的類都是以Stream結(jié)尾的,針對字符操作的類則是以Reader或者Writer作為結(jié)尾。這樣劃分下來,就會減輕不少的API學(xué)習(xí)量。 基本上進行讀取或者寫入操作的時候按照下面五個步驟: 根據(jù)這5個步驟,下面寫個小程序來試驗一下對文件的讀去和寫入操作。 /*從磁盤中以字節(jié)方式讀取名為ball.jpg圖片,并建立起之間的讀取流*/ 關(guān)于隨機訪問以及對象的讀取和寫入下次再總結(jié)。 下面總結(jié)一下JFileChooser的用法 //根據(jù)File對象parent的路徑和字符串child連接起來形成個新的字符串,并將其作為新File的路徑名字字符串 比較常用的方法: 打開文件對話框: import java.io.File; public class FileChooserTest { public static void main(String [] args) { //首先是創(chuàng)建JFileChooser 對象,里面帶個參數(shù),表示默認(rèn)打開的目錄,這里是默認(rèn)打開當(dāng)前文件所在的目錄。 JFileChooser file = new JFileChooser ("."); /*使用showOpenDialog()方法,顯示出打開選擇文件的窗口,當(dāng)選擇了某個文件后,或者關(guān)閉此窗口那么都會返回一個 整型數(shù)值,如果返回的是0,代表已經(jīng)選擇了某個文件。如果返回1代表選擇了取消按鈕或者直接關(guān)閉了窗口*/ /*JFileChooser.APPROVE_OPTION是個整型常量,代表0。就是說當(dāng)返回0的值我們才執(zhí)行相關(guān)操作,否則什么也不做。 /*獲得你選擇的文件絕對路徑。并輸出。當(dāng)然,我們獲得這個路徑后還可以做很多的事。 System.out.println("你已取消并關(guān)閉了窗口!"); /*因為我們需要創(chuàng)建一個文件的過濾器,以便讓文件對話框顯示我們指定的文件。這里我們就以Excel文件和exe文件舉例。 那么要做到這點我們就需要重寫FileFilter 類的accept來設(shè)置相關(guān)的過濾器。這個繼承類你可以寫成外部類、內(nèi)部類甚至是 匿名內(nèi)部類。我這里寫成了一個內(nèi)部類的形式。因為是在main方法使用他,因此這個類也要定義成 靜態(tài)的。 private static class ExcelFileFilter extends FileFilter { String ext; //構(gòu)造方法的參數(shù)是我們需要過濾的文件類型。比如excel文件就是 xls,exe文件是exe. ExcelFileFilter(String ext) { this.ext = ext; /*這個方法就是重寫 FileFilter 類的方法,參數(shù)是File對象,一般這個參數(shù)是如何傳入的我們可以不用關(guān)心。他返回一個布爾型。如果為真表示該文件符合過濾設(shè)置,那么就會顯示在當(dāng)前目錄下,如果為假就會被過濾掉。 public boolean accept(File file) { //首先判斷該目錄下的某個文件是否是目錄,如果是目錄則返回true,即可以顯示在目錄下。 if (file.isDirectory()) //獲得某個文件的文件名,然后使用lastIndexOf()來獲得這個文件名字符串中‘.‘這個字符最后一次出現(xiàn)的位置。并且通過它返回的一個整型來判斷該文件是否符合*.*這中文件+文件名的格式,如果不符合那么就不顯示這個文件。如果符合,那么就將‘.‘字符后面的字符串提取出來與過濾的文件名相比較,如果相等則符合該文件格式,并顯示出來。如果不相等那么就將其過濾掉。*/ String fileName = file.getName(); if (index > 0 && index < fileName.length() - 1) /*這個方法也是重寫FileFilter的方法,作用是在過濾名那里顯示出相關(guān)的信息。這個與我們過濾的文件類型想匹配,通過這些信息,可以讓用戶更清晰的明白需要過濾什么類型的文件。*/ public String getDescription() { if (ext.equals("xls"))
打開選擇文件的對話框就建立好了。但是上面的程序還有瑕疵。因為只有當(dāng)用戶點取消或關(guān)閉該窗口時才不會執(zhí)行任何操作。而如果用戶在對話框里輸入的文件在當(dāng)前目錄中不存在時,那么窗口依然會關(guān)閉,這時可能就需要在程序中再來做判斷。那么可不可以在當(dāng)用戶輸入錯誤的文件名后,窗口不會關(guān)閉,而是不執(zhí)行任何操作或者彈出個對話框提示用戶,可以看看大多數(shù)window程序中的選擇對話框都是這么做的,其實要實現(xiàn)這個功能也不難, 只需要再重寫一下JFileChooser類的approveSelection()方法就行了。 我們將上面的程序做下修改,首先還是需要創(chuàng)建一個繼承于JFileChooser的類,這個類可以寫成外部或者內(nèi)部類,我們這里依然寫為內(nèi)部類,注意,如果需要在靜態(tài)方法中調(diào)用它,則需要將它設(shè)置為靜態(tài)的。 private static class MyChooser extends JFileChooser { /** File file = new File(getSelectedFile().getPath()); if (file.exists()) } 把上面這段代碼添加進剛才的類里面,然后把 JFileChooser file = new JFileChooser (".");改成 JFileChooser file = new MyChooser ("."); 好了,現(xiàn)在我們就可以在不關(guān)閉該對話框的情況下判斷用戶的輸入是否錯誤了。還可以加入正則表達式,判斷用戶輸入是否符合規(guī)定,操作方式按照這個框架來寫就沒問題了。這里不再贅述。下面是保存對話框! 保存對話框: 其實保存對話框和打開文件對話框在使用上沒什么區(qū)別,他們都是使用同一個類JFileChooser,因為在swing當(dāng)中打開和保存對話框不會做出任何對文件進行處理的功能,所有的這些功能需要我們自己去實現(xiàn),而僅僅是提供了1個這樣的窗口模型而已。因此這兩種窗口其實只是將按鈕的標(biāo)簽進行了替換而已 。創(chuàng)建他們唯一的區(qū)別就是打開是調(diào)用showOpenDialog()方法,保存則是調(diào)用showSaveDialog(),創(chuàng)建形式幾乎一樣。我們在使用他們的時候就需要分別對這兩種窗口的返回后進行不同的處理,設(shè)置過濾器是一樣的,因此過濾器我們就復(fù)用上面打開文件窗口的方法,但是在判斷輸入保存文件是否在當(dāng)前目錄下時,我們需要做出不一樣的處理。當(dāng)用戶輸入了與當(dāng)前目錄相同的文件名后,要彈出對話框詢問用戶是否需要覆蓋原文件,如果用戶選擇否,那么返回保存文件的對話框允許用戶繼續(xù)選擇或者輸入保存的文件名。 下面我只需要修改上面代碼的兩個地方就能夠達到目的。首先將修改一下MyChooser這個類 private static class MyChooser extends JFileChooser { /*同樣是覆蓋approveSelection方法,首先獲得輸入文件的路徑,然后判斷其是否在當(dāng)前目錄下,如果存在,那么彈出對話框詢問是否需要覆蓋當(dāng)前文件,如果選擇取消,則回到保存對話框,用戶可以繼續(xù)進行保存的操作。*/ 再把上面的 int result = file.showOpenDialog(null); 改成 int result = file.showSaveDialog(null); 兩個基本的選擇文件對話框就創(chuàng)建完成了。 如果需要多選,那么要設(shè)置setMultiSelectionEnabled(true) 那么File file = this.getSelectedFile();這句我們就要改成 File [] files = this.getSelectedFiles(); files這個數(shù)組里面就存放的是選擇多個文件File對象,然后我們只需要對這個數(shù)組進行操作即可。 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1531654 |
|