Java 中的文件选择器JFileChooser的用法,以及文件过滤器FileFilter使用的注意点

本博客的目的性很强,就是奔着怎么使用java中JFileChooser文件选择器来的,那么很多内部原理性的东西就不过于赘述了,直接以例子出发,帮助大家理解怎么使用它

定义一个常量用于保存文件目录

创建一个方法用于封装文件选择器,这里之所以不把代码写在main方法中的原因是:
可以有效避免main方法中代码的混杂冗长 不便于阅读,
还用到了java中的封装思想

public class FileInputStreamTest {
	private static final String path = ".";// 表示当前目录

	public static void main(String[] args) throws Exception {
		fileChooser();//将选择器封装在该方法中
	}

直接实例化JFileChooser对象

这里有几个注意点: 实例化JFileChooser传入的参数为文件的目录, setFileSelectionMode这个方法的参数要传对
否则会出现找不到文件的现象还有就是添加过滤器的时候,一定要注意包名不要导错了 这里正确的包名是
import javax.swing.filechooser.FileFilter; 而不是import java.io.FileFilter; 所有大家要注意了
还有就是showOpenDialog这个方法如果没有父窗体 也就是参数为null 一定不要放在setFileFilter方法的前面
不然会使文件过滤器失效的问题.

public static File fileChooser() {
		JFileChooser jf = new JFileChooser(path);// 实例化文件选择器
		/*
		 * 设置可选类型 参数有三个 分别为 
		 * •JFileChooser.FILES_ONLY  仅仅选择文件
		 * •JFileChooser.DIRECTORIES_ONLY 仅仅选择目录
		 * •JFileChooser.FILES_AND_DIRECTORIES  既选择文件又选择目录
		 */
		jf.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		// 设置文件过滤
		jf.setFileFilter(new FileFilter() {// FileFilter 为抽象类
			// 注意:这个不是实例化FileFilter类 , 这是采用内部类的方式

			@Override
			public String getDescription() {// 显示为指定后缀名的文件
				return ".java";
			}

			@Override
			public boolean accept(File f) {// 判断文件是否已java结尾
				if (f.getName().endsWith("java")) {
					return true;
				} else {
					return false;
				}
			}
		});
		jf.showOpenDialog(null);// 设置打开时的窗口 null表示没有父窗口
		return jf.getSelectedFile(); // 返回得到选择器选择的文件
	}

调用这个方法后 会出现如图所示的界面 请看下图:
Java 中的文件选择器JFileChooser的用法,以及文件过滤器FileFilter使用的注意点_第1张图片
发现没有文件,然后下面有个文件类型的选择框 我们选择所有文件 如下图
Java 中的文件选择器JFileChooser的用法,以及文件过滤器FileFilter使用的注意点_第2张图片
这个时候 我们看到文件了 然后进入src文件夹可以看到这个文件夹的所有文件
Java 中的文件选择器JFileChooser的用法,以及文件过滤器FileFilter使用的注意点_第3张图片
当我们把文件类型换成.java的时候,可以看到只显示.java后缀名的文件 显然 我们的过滤器生效了
Java 中的文件选择器JFileChooser的用法,以及文件过滤器FileFilter使用的注意点_第4张图片
点击打开一个文件 也就是选择了这个文件,然后调用getSelectedFile方法得到我们选中的文件
下面有个测试方法来测试是否成功

添加一个测试方法

这个测试方法的用途是把选择器选中的文件通过字节流的方式读取并打印在出来.
这里要说明的是JOptionPane.showMessageDialog这个方法是java中的一个弹窗提示方法 具体我也不多阐述
因为这不是今天的主题,然后要说的是从jdk1.7开始 try提供了一个新的东西 那就是try后面可以跟圆括号,括号里面可以写需要释放资源的代码 ,它会在执行完毕自动的释放资源,查java api文档可以发现,它们实现了AutoCloseable这个接口,try大括号里面的代码在执行完毕后并不会立即销毁,而圆括号里面的执行完毕后就会自动调用close方法释放资源并销毁对象.

public static void fileChooserTest(File file) {
		if (file == null) {
			JOptionPane.showMessageDialog(null, "你已取消选择");// 弹窗提示
			System.exit(0);
		} else {
			System.out.println("当前文件名为:" + file.getName() + "\n绝对路径为:" + file.getAbsolutePath());
			/*
			 * 从jdk1.7开始 try后面就可以跟圆括号并且括号里面的资源会自动调用close();方法 释放资源
			 * 因此不需要在后面加finally释放资源,这省去了很多麻烦
			 */
			try (FileInputStream fileInputStream = new FileInputStream(file);
					InputStream stream = new BufferedInputStream(fileInputStream, 10240);) {
				byte[] b = new byte[(int) file.length()];
				stream.read(b);
				System.out.println(new String(b));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

运行结果如下图所示,字节流读取文件再打印,它帮我们把代码的格式也完美的打印了出来.
Java 中的文件选择器JFileChooser的用法,以及文件过滤器FileFilter使用的注意点_第5张图片
最后, 在这里为大家奉上完整的代码

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

public class FileInputStreamTest {
	private static final String path = ".";// 表示当前目录

	public static void main(String[] args) throws Exception {
		fileChooserTest(fileChooser());//直接调用该方法
	}
	/**
	 * 将选择器封装在该方法中
	 * @return 返回一个文件
	 */
	public static File fileChooser() {
		JFileChooser jf = new JFileChooser(path);// 实例化文件选择器
		/*
		 * 设置可选类型 参数有三个 分别为 
		 * •JFileChooser.FILES_ONLY  仅仅选择文件
		 * •JFileChooser.DIRECTORIES_ONLY 仅仅选择目录
		 * •JFileChooser.FILES_AND_DIRECTORIES  既选择文件又选择目录
		 */
		jf.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		// 设置文件过滤
		jf.setFileFilter(new FileFilter() {// FileFilter 为抽象类
			// 注意:这个不是实例化FileFilter类 , 这是采用内部类的方式

			@Override
			public String getDescription() {// 显示为指定后缀名的文件
				return ".java";
			}

			@Override
			public boolean accept(File f) {// 判断文件是否已java结尾
				if (f.getName().endsWith("java")) {
					return true;
				} else {
					return false;
				}
			}
		});
		jf.showOpenDialog(null);// 设置打开时的窗口 null表示没有父窗口
		return jf.getSelectedFile(); // 返回得到选择器选择的文件
	}
	public static void fileChooserTest(File file) {
		if (file == null) {
			JOptionPane.showMessageDialog(null, "你已取消选择");// 弹窗提示
			System.exit(0);
		} else {
			System.out.println("当前文件名为:" + file.getName() + "\n绝对路径为:" + file.getAbsolutePath());
			/*
			 * 从jdk1.7开始 try后面就可以跟圆括号并且括号里面的资源会自动调用close();方法 释放资源
			 * 因此不需要在后面加finally释放资源,这省去了很多麻烦
			 */
			try (FileInputStream fileInputStream = new FileInputStream(file);
					InputStream stream = new BufferedInputStream(fileInputStream, 10240);) {
				byte[] b = new byte[(int) file.length()];
				stream.read(b);
				System.out.println(new String(b));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

以上内容讲到了,java中的选择器JFileChooser,已以及文件过滤器FileFilter,还有jdk1.7的新特性等等东西…
好了,本期的内容就到此为止了,当然除了上述讲到的东西,你还可以自由发挥,去摸索更多额外的东西,我们下期见。

你可能感兴趣的:(java)