java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JFileChooser
当我们在处理窗口上的一些操作,特别是文本处理的部份,例如一个文本编辑器上打了一段文字,我们可能希望将此段文字存储起来 ,供以后方便使用,此时系统应当提供一个存储文件的对话框,将此段文字存到一个自定义或内定的文件名中.同样,当我们要叫出某个 文件时,系统也应当提供打开文件的功能,让我们选择所欲打开的文件.在java中这些操作都可以由JFileChoose组件来达成.这个组件 提供了打开文件存盘的窗口功能,也提供了显示特定类型文件图标的功能,亦能针对某些文件类型做过滤的操作.如果你的系统需要对 某些文件或文件做操作,JFileChooser组件可以让你轻松地做出漂亮的用户界面.在这边读者要注意的是,JFileChooser本身不提供读 文件或存盘的功能,这些功能必须你自行实作.事实上,JFileChooser本身只是一个对话框模型,它也是依附在JDialog的结构上,因此 它只是一个针对文件操作的对话框,当然本身也就不会有读文件或存盘的功能!以下我们来看JFileChooser的构造函数:
介绍完JFileChooser构造函数后,我们来实作一个简单的范例.这个范例可以让用户在JTextArea上输入文字,输入完后按下"存储 文件"按钮就可以打开JFileChooser存储文件对话框,用户可以输入欲存储的文件名,按下"Save"按钮就可以存储文件.若用户要打开 某个文件内容,只需要按下"打开文件"按钮,就会出现JFileChooser打开文件对话框,用户选择好所欲打开的文件就可以将数据读入 JTextArea中.
在这个范例中,我们使用JFileChooser的showOpenDialog()或showSaveDialog()方法来打开文件对话框,此两个方法在用户按下 按钮或关闭对话框时会返回一个整数值,这个整数值的类型有3种,分别是:
利用这3个整数值我们就能判断用户到底在对话框中做了什么操作,并加以处理,例如当用户选择了文件并按下确定键后,我们就可 以利用getSelectedFile()方法取得文件对象,利用这个文件对象我们就能够取得文件名称(getName())与文件路径(getPath());
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class FileChooserDemo1 implements ActionListener {
JFrame f = null;
JLabel label = null;
JTextArea textarea = null;
JFileChooser fileChooser = null;
public FileChooserDemo1() {
f = new JFrame("FileChooser Example");
Container contentPane = f.getContentPane();
textarea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textarea);
scrollPane.setPreferredSize(new Dimension(350, 300));
JPanel panel = new JPanel();
JButton b1 = new JButton("新建文件");
b1.addActionListener(this);
JButton b2 = new JButton("存储文件");
b2.addActionListener(this);
panel.add(b1);
panel.add(b2);
label = new JLabel(" ", JLabel.CENTER);
fileChooser = new JFileChooser("D:\\");// 建立一个FileChooser对象,并指定D:的目录为默认文件对话框路径.
contentPane.add(label, BorderLayout.NORTH);
contentPane.add(scrollPane, BorderLayout.CENTER);
contentPane.add(panel, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new FileChooserDemo1();
}
public void actionPerformed(ActionEvent e) {
File file = null;
int result;
/*
* 当用户按下"打开文件"按钮时,JFileChooser的showOpenDialog()方法会输出文件对话框,并利用
* setApproveButtonText
* ()方法取代按钮上"Open"文字;以setDialogTitle()方法设置打开文件对话框Title名称.
* 当使用选择完后,会将选择结果存到result变量中.
*/
if (e.getActionCommand().equals("新建文件")) {
fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("打开文件");
result = fileChooser.showOpenDialog(f);
textarea.setText("");
/*
* 当用户按下打开文件对话框的"确定"钮后,我们就可以利用getSelectedFile()方法取得文件对象.若是用户按下打
* 开文件对话框的"Cancel"钮,则将在label上显示"你没有选择任何文件"字样.
*/
if (result == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
label.setText("您选择打开的文件名称为:" + file.getName());
} else if (result == JFileChooser.CANCEL_OPTION) {
label.setText("您没有选择任何文件");
}
FileInputStream fileInStream = null;
if (file != null) {
try {
// 利用FileInputStream将文件内容放入此数据流中以便读取.
fileInStream = new FileInputStream(file);
} catch (FileNotFoundException fe) {
label.setText("File Not Found");
return;
}
int readbyte;
try {
// 以read()方法读取FileInputStream对象内容,当返回值为-1时代表读完此数据流.将所读到的字符显示
// 在textarea中.
while ((readbyte = fileInStream.read()) != -1) {
textarea.append(String.valueOf((char) readbyte));
}
} catch (IOException ioe) {
label.setText("读取文件错误");
} finally {// 回收FileInputStream对象,避免资源的浪费.
try {
if (fileInStream != null)
fileInStream.close();
} catch (IOException ioe2) {
}
}
}
}
// 实作写入文件的功能.
if (e.getActionCommand().equals("存储文件")) {
result = fileChooser.showSaveDialog(f);
file = null;
String fileName;
// 当用户没有选择文件,而是自己键入文件名称时,系统会自动以此文件名建立新文件.
if (result == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
label.setText("您选择存储的文件名称为:" + file.getName());
} else if (result == JFileChooser.CANCEL_OPTION) {
label.setText("您没有选择任何文件");
}
// 写入文件我们使用FileOutputStream,在这个范例中,我们写入文件的方式是将之前内容清除并重新写入.若你想把
// 新增的内容加在原有的文件内容后面,你可以使用FileOutputStream(String name,Boolean
// append)这个构造函数.
FileOutputStream fileOutStream = null;
if (file != null) {
try {
fileOutStream = new FileOutputStream(file);
} catch (FileNotFoundException fe) {
label.setText("File Not Found");
return;
}
String content = textarea.getText();
try {
fileOutStream.write(content.getBytes());
} catch (IOException ioe) {
label.setText("写入文件错误");
} finally {
try {
if (fileOutStream != null)
fileOutStream.close();
} catch (IOException ioe2) {
}
}
}
}
}
}