小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java學(xué)習(xí)---流、JFileChooser

 iversion 2007-05-22

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)
1、什么是流
當(dāng)數(shù)據(jù)源需要將數(shù)據(jù)傳輸?shù)侥硞€目標(biāo)的時候,那么他們之間就應(yīng)該建立一個連接,這個連接我們就稱之為流。比如當(dāng)我們在一個程序中需要讀取磁盤上某個文件時,這時文件就相當(dāng)于目標(biāo),運行中的程序就相當(dāng)于數(shù)據(jù)源,我們需要把目標(biāo)的數(shù)據(jù)讀入到程序中來,就是通過流作為中間媒介傳輸這些數(shù)據(jù)的。因此我們有個類FileInputStream.同樣,當(dāng)我們需要將程序中的某些數(shù)據(jù)輸出到磁盤文件中時,那么這個時候程序就相當(dāng)于數(shù)據(jù)源,文件就是目標(biāo)。并在他們中間建立一個供數(shù)據(jù)傳輸?shù)倪B接---流,也有個類FileOutputStream。這兩個類是基于字節(jié)的文件讀入寫出流,稍候會看到他們的用法。由此我們可以看到,流一般分為兩種,讀取流(input)寫入流(output)。

2、為什么需要流
我們知道,象I/O這類的操作其實是比較底層的,而且操作也是非常的煩瑣,這個也不符合java語言的特點。因此就提出了流這個概念,并將一些比較底層的I/O數(shù)據(jù)操作封裝起來,通過流這個概念來理解它,操作它。這樣可以降低我們程序的復(fù)雜度,同時避開了更多的與系統(tǒng)底層打交道,提升了程序的可讀性與可維護性。

3、什么地方需要使用流
當(dāng)我們需要在數(shù)據(jù)源與目標(biāo)之間讀取或者寫入數(shù)據(jù)時,就要在他們之間建立流連接。這就象我們電腦中的硬盤一樣,我們要使用硬盤,讀取或者寫入數(shù)據(jù),首先要將硬盤同電腦的主板連接起來,那么主板與硬盤之間就有一條數(shù)據(jù)線起到連接的作用,通過數(shù)據(jù)線來寫入或者讀取數(shù)據(jù)。這個數(shù)據(jù)線就相當(dāng)于流的作用。

4、怎樣建立流
明白了什么是流之后就需要建立流。那么如何建立呢,在java的基礎(chǔ)類庫中,提供了兩種IO包來操作流,一種就是經(jīng)常會使用到的java.io包,還有一種是jdk1.4引入的新IO包java.nio.*,這個包基本上是對原IO包進行了重新封裝,以便提供更快的速度。新的IO包還沒接觸過,因此目前還是以舊的IO包來進行總結(jié)。雖然IO包中的類很多,但是很容易就能看出他們之間的規(guī)律。根據(jù)操作的數(shù)據(jù)類型基本上可以劃分為三個層次

(1)基于字節(jié)輸入輸出,如InputStream/OutputStream
(2)基于字符輸入輸出,如Reader/Writer
(3)基于對象輸入輸出,如ObjectInputStream/ObjectOutputStream

由上面可以看出,基本上針對字節(jié)操作的類都是以Stream結(jié)尾的,針對字符操作的類則是以Reader或者Writer作為結(jié)尾。這樣劃分下來,就會減輕不少的API學(xué)習(xí)量。
針對字節(jié)和針對字符操作的類在使用上都很相似,怎么在這兩者之間進行選擇呢。由于操作字節(jié)還是比較底層的操作,因此一般在非必須使用字節(jié)操作的時候,盡可能的使用基于字符的輸入輸出。

基本上進行讀取或者寫入操作的時候按照下面五個步驟:
(1)首先要明確是需要讀取還是寫入操作,從而選擇是使用Input/Output或者Reader/Writer
(2)明確操作的目標(biāo)是什么,文件或者緩存、對象等等,從而選定具體操作的類
(3)選定好了類之后,我們就需要創(chuàng)建該類的對象,創(chuàng)建對象時一般是通過傳入該類構(gòu)造器的參數(shù)來建立流連接。
(4)完成讀和寫的操作。一般這些類當(dāng)中都有read()或者write()方法,一個是讀入流的方法,一個是寫入流的方法。
(5)最后要使用close()關(guān)閉流連接,刷新緩存,釋放資源。

根據(jù)這5個步驟,下面寫個小程序來試驗一下對文件的讀去和寫入操作。

/*從磁盤中以字節(jié)方式讀取名為ball.jpg圖片,并建立起之間的讀取流*/
FileInputStream input = new FileInputStream("image/ball.jpg");
/*創(chuàng)建copyball.jpg圖片格式文件,建立起之間的寫入流*/
FileOutputStream output = new FileOutputStream("image/copyball.jpg");
int i;
//使用循環(huán)進行逐一讀取其中的字節(jié)到讀取流,轉(zhuǎn)換成整型返回,同時將數(shù)據(jù)寫入到寫入流中,當(dāng)下一個字節(jié)沒有數(shù)據(jù)時,將返回-1,由此來跳出循環(huán)
while((i = input.read())!= -1)
{
 output.write(i);
}
//最后關(guān)閉讀取和寫入流。
input.close();
output.close();

關(guān)于隨機訪問以及對象的讀取和寫入下次再總結(jié)。

下面總結(jié)一下JFileChooser的用法
在看JFileChooser之前,先了解一下File這個文件類,其實更貼切點說應(yīng)該叫文件路徑類。因為這個類不僅可以實現(xiàn)對文件的操作,還可以對目錄進行相關(guān)的操作。
可以把File類看作是對文件和目錄的一個實用工具類。他里面有許多有用的方法,首先來看下他的構(gòu)造方法:
要創(chuàng)建File對象必須要先創(chuàng)建它的對象,并且構(gòu)造方法需要帶參數(shù)。他一共有4個構(gòu)造方法,一般比較常用的是下面三種:

//根據(jù)File對象parent的路徑和字符串child連接起來形成個新的字符串,并將其作為新File的路徑名字字符串
File(File parent, String child)
//根據(jù)字符串pathname作為路徑名字創(chuàng)建新的File對象
File(String pathname)
//根據(jù)字符串parent和child作為路徑名字創(chuàng)建新的File對象
File(String parent, String child)

比較常用的方法:
boolean canRead() 判斷文件是否可讀
boolean canWrite() 判斷文件是否可寫
int compareTo(File pathname) 按字母順序比較兩個File對象的路徑
boolean delete() 刪除目錄或者文件
boolean exists() 測試此文件或目錄是否存在
File getAbsoluteFile() 返回抽象路徑的File對象
String getAbsolutePath()  返回絕對路徑
String getName()  返回該文件或目錄的名字
String getParent()  返回該抽象路徑的父路徑名,如果沒有父路徑則返回null
String getPath() 將抽象路徑名轉(zhuǎn)換為字符串]
boolean isAbsolute() 判斷該抽象路徑是否是一個絕對路徑
boolean isDirectory() 判斷是否為目錄
boolean isFile() 判斷是否為文件
boolean isHidden() 判斷是否為隱藏
long lastModified() 獲得最后一次修改的時間,該時間是一個毫秒數(shù)
long length() 獲得文件的長度
String[] list() 將該抽象路徑下的所有文件和目錄路徑名字符串包存在一個字符串?dāng)?shù)組中。這個方法非常有用。
 
其實JFileChooser基本使用方法還是很簡單的,下面寫兩個示例看了就明白了,如果還要增加一些功能,我們還可以添加過濾器,只顯示過濾后的文件。還可以再保存的時候,如果保存的是目錄里已經(jīng)存在的文件,那么對話框不會關(guān)閉,并且彈出一個JOptionPane提示用戶是否保存文件。

打開文件對話框:

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;

public class FileChooserTest {

  public static void main(String [] args) {

  //首先是創(chuàng)建JFileChooser 對象,里面帶個參數(shù),表示默認(rèn)打開的目錄,這里是默認(rèn)打開當(dāng)前文件所在的目錄。

  JFileChooser file = new JFileChooser (".");
  //下面這句是去掉顯示所有文件這個過濾器。
  file.setAcceptAllFileFilterUsed(false);
  //添加excel文件的過濾器
  file.addChoosableFileFilter(new ExcelFileFilter("xls"));
  //添加exe文件的過濾器
  file.addChoosableFileFilter(new ExcelFileFilter("exe"));

  /*使用showOpenDialog()方法,顯示出打開選擇文件的窗口,當(dāng)選擇了某個文件后,或者關(guān)閉此窗口那么都會返回一個

整型數(shù)值,如果返回的是0,代表已經(jīng)選擇了某個文件。如果返回1代表選擇了取消按鈕或者直接關(guān)閉了窗口*/
  int result = file.showOpenDialog(null);

/*JFileChooser.APPROVE_OPTION是個整型常量,代表0。就是說當(dāng)返回0的值我們才執(zhí)行相關(guān)操作,否則什么也不做。
  if(result == JFileChooser.APPROVE_OPTION)
  {

 /*獲得你選擇的文件絕對路徑。并輸出。當(dāng)然,我們獲得這個路徑后還可以做很多的事。
   String path = file.getSelectedFile().getAbsolutePath();
   System.out.println(path);
  }
  else
  {

    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())
   {
    return true;
   }

  //獲得某個文件的文件名,然后使用lastIndexOf()來獲得這個文件名字符串中‘.‘這個字符最后一次出現(xiàn)的位置。并且通過它返回的一個整型來判斷該文件是否符合*.*這中文件+文件名的格式,如果不符合那么就不顯示這個文件。如果符合,那么就將‘.‘字符后面的字符串提取出來與過濾的文件名相比較,如果相等則符合該文件格式,并顯示出來。如果不相等那么就將其過濾掉。*/

   String fileName = file.getName();
   int index = fileName.lastIndexOf(‘.‘);

   if (index > 0 && index < fileName.length() - 1)
   {
    String extension = fileName.substring(index + 1).toLowerCase();
    if (extension.equals(ext))
     return true;
   }
   return false;
  }

/*這個方法也是重寫FileFilter的方法,作用是在過濾名那里顯示出相關(guān)的信息。這個與我們過濾的文件類型想匹配,通過這些信息,可以讓用戶更清晰的明白需要過濾什么類型的文件。*/ 

  public String getDescription() {

   if (ext.equals("xls"))
   {
    return "Microsoft Excel文件(*.xls)";
   }
   if(ext.equals("exe"))
   {
    return "可執(zhí)行文件(*.exe)";
   }
   return "";
  }
 }
 
 }

 

打開選擇文件的對話框就建立好了。但是上面的程序還有瑕疵。因為只有當(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 {
  MyChooser(String path) {
   super(path);
  }

  /**
   * 重載JFileChooser的方法,當(dāng)在文件選擇對話框中,并在當(dāng)前
   * 目錄下沒有找到輸入的文件,則對話框不會關(guān)閉。直到選擇的文件 在當(dāng)前選擇的目錄下,才關(guān)閉對話框,并執(zhí)行后面的操作。
   */
  public void approveSelection() {

   File file = new File(getSelectedFile().getPath());

 if (file.exists())
    super.approveSelection();
   else
    JOptionPane.showMessageDialog(null, "你選擇的文件不存在,請重新選擇!");

}

把上面這段代碼添加進剛才的類里面,然后把

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 {
  MyChooser(String path) {
   super(path);
  }

/*同樣是覆蓋approveSelection方法,首先獲得輸入文件的路徑,然后判斷其是否在當(dāng)前目錄下,如果存在,那么彈出對話框詢問是否需要覆蓋當(dāng)前文件,如果選擇取消,則回到保存對話框,用戶可以繼續(xù)進行保存的操作。*/
  public void approveSelection() {
   File file = this.getSelectedFile();
   if (file.exists())
   {
    int copy = JOptionPane.showConfirmDialog(null,
      "是否要覆蓋當(dāng)前文件?", "保存", JOptionPane.YES_NO_OPTION,
      JOptionPane.QUESTION_MESSAGE);
    if (copy == JOptionPane.YES_OPTION)
     super.approveSelection();
   }
   else
    super.approveSelection();
  }
 }

再把上面的

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多