輸入和輸出流__檔案對話方塊 JFileChooser
使用檔案對話方塊 指定輸入輸出檔案 是一個常用功能。 本博文介紹 用檔案對話方塊 開啟和儲存 檔案的方法
使用javax.swing.JFileChooser 實現開啟和儲存檔案對話方塊
一. JFileChooser 類的常用方法
showOpernDialog() 開啟 "開啟檔案對話方塊"
showSaveDialog() 開啟 "儲存檔案對話方塊"
檔案對話方塊開啟後,在使用者按下按鈕或關閉對話方塊時,上述兩個方法會返回一個整數值,分別為:
JFileChooser.APPROVE_OPTION : “撤消” 按鈕
JFileChooser.CANCEL_OPTION: "開啟/儲存" 按鈕
JFileChooser.ERROR_OPTION: 出錯,或是對話方塊非正常關閉
二. 當程式發現使用者選擇了檔案並按下了 "開啟/儲存" 按鈕後,程式就可以利用 getSelectedFile() 取得檔案物件, 並利用這個檔案物件用方法 getName() 取得檔案的名稱, 用方法getPath() 取得檔案的路徑.
看一個例子, 程式首先彈出一個介面,有兩個按鈕:開啟檔案和儲存檔案。 當點選 開啟檔案時,彈出一個開啟檔案對話方塊; 當點選儲存檔案時, 彈出儲存檔案對話方塊。 程式設定了檔案對話方塊的篩選條件。
程式入口:
FrameFileDialog 類:public class Example9_6 { public static void main(String[] args) { FrameFileDialog f = new FrameFileDialog(); } }
MyFileFilter 類:import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class FrameFileDialog extends JFrame implements ActionListener { JFileChooser filedialog = null; JLabel label = new JLabel("", JLabel.CENTER); JButton b1, b2; JTextArea text; public FrameFileDialog() { super("帶檔案對話方塊的視窗"); Container container = this.getContentPane(); container.setLayout(new BorderLayout()); container.setSize(100, 80); JPanel p = new JPanel(); b1 = new JButton("開啟檔案"); b2 = new JButton("儲存檔案"); b1.addActionListener(this); b2.addActionListener(this); p.add(b1); p.add(b2); text = new JTextArea(20, 30); JScrollPane jScrollPane = new JScrollPane(); filedialog = new JFileChooser(); //"D:\\Download" // 建立一個FileChooser 物件,並指定目錄為預設檔案對話方塊路徑 filedialog.setControlButtonsAreShown(true); //顯示開啟和撤消按鈕 filedialog.addChoosableFileFilter(new MyFileFilter("txt")); filedialog.addChoosableFileFilter(new MyFileFilter("java")); text.setBackground(Color.cyan); container.add(jScrollPane, BorderLayout.CENTER); container.add(label,BorderLayout.NORTH); container.add(p, BorderLayout.SOUTH); setVisible(true); pack(); } @Override public void actionPerformed(ActionEvent e) { File file = null; int result; if(e.getSource() == b1) { filedialog.setDialogTitle("開啟檔案"); result = filedialog.showOpenDialog(this); text.setText(""); if(result == JFileChooser.APPROVE_OPTION) { file = filedialog.getSelectedFile(); label.setText("你選擇開啟的檔名稱是: " + file.getName()); //以下是開啟檔案 過程, 以notepad 記事本方式 開啟 Runtime r = Runtime.getRuntime(); Process p = null; String cmd[] = { "notepad", file.getAbsolutePath()}; try { p = r.exec(cmd); } catch (Exception ex) { label.setText("error executing " + cmd[0]); } }else if(result == JFileChooser.CANCEL_OPTION){ label.setText("你沒有選擇任何檔案"); } FileInputStream fileInputStream; if(file != null) { try { fileInputStream = new FileInputStream(file); } catch (FileNotFoundException e1) { label.setText("檔案沒有找到"); e1.printStackTrace(); return; } int readByte; try { while((readByte = fileInputStream.read()) != -1){ text.append(""+(char)readByte); } fileInputStream.close(); } catch (IOException e1) { label.setText("讀取檔案出錯"); e1.printStackTrace(); } } }else if(e.getSource() == b2) { //儲存檔案 filedialog.setDialogTitle("儲存檔案"); result = filedialog.showSaveDialog(this); file = null; String fileName; if(result == JFileChooser.APPROVE_OPTION) { file = filedialog.getSelectedFile(); label.setText("你選擇儲存的檔名稱是: "+ file.getName()); }else if(result == JFileChooser.CANCEL_OPTION) { label.setText("你沒有選擇任何檔案"); } FileOutputStream fos; if(file != null){ try { fos = new FileOutputStream(file); } catch (FileNotFoundException e1) { label.setText("檔案沒有發現"); e1.printStackTrace(); return; } String content = text.getText(); try { fos.write(content.getBytes()); fos.close(); } catch (IOException e1) { label.setText("寫檔案出錯"); e1.printStackTrace(); } } } } }
import java.io.File;
import javax.swing.filechooser.FileFilter;
public class MyFileFilter extends FileFilter {
String ext;
public MyFileFilter(String t) {
ext = t;
}
@Override
public boolean accept(File f) {
if(f.isDirectory())
return true;
String fn = f.getName();
int index = fn.lastIndexOf('.');
if(index > 0 && index < fn.length() -1) {
String extension = fn.substring(index+1).toLowerCase();
if(extension.equals(ext))
return true;
}
return false;
}
@Override
public String getDescription() {
if(ext.equals("java")){
return "JAVA Source File(*.java)";
}else if("txt".equals(ext)){
return "Txt File(*.txt)";
}
return "";
}
}
執行效果
在開啟檔案對話方塊中, 可以設定篩選條件, 即指定檔案的型別. 使用FileFilter類,該類預設兩個方法,分別是 accept(File f) 與getDescription() . 當目錄中的檔案與篩選條件相符時,方法accept() 返回true, 並將此檔名顯示在對話方塊中。而getDescription() 方法則是對篩選條件的描述. 由程式指定,例如, "*.java" 等. 如圖
由於FileFilter 類是一個抽象類,程式要設定開啟檔案對話方塊的檔案篩選條件,必須繼承這個類.實現上面兩個方法, 然後就可以使用 JFileChooser類的addChoosableFileFilter() 方法, 或者是setFileFilter() 方法設定篩選條件.