java学习第八周总结(2) ---流、JFileChooser 这两天主要学习内容是java的I/O操作。I/O(输入/输出)是每个程序必须具备的。因此这个知识点也是作为一名程序员必须掌握的,由此可见它的重要性。虽然我们学习java1个多月以来,今天才开始正式的接触到I/O,但是之前我们的程序中也或多或少使用到了它,只是那个时候对它的概念还比较模糊而已。也正式由于它的重要性,因此它所涉及的面也非常的广,对于我们这些初学java的程序员来说要全面,透彻的了解它和掌握它也不大可能。学习本来就是一个循序渐进的过程,切忌好高骛远。要脚踏实地,不断的发现问题、解决问题,积累经验,这样才能更深刻地理解和掌握这一门语言,而不仅仅是熟练,或者所谓的精通某某技术。 今天主要总结两点:流(Stream)的概念和JFileChooser的用法。再深入点的内容我也仅仅只有点概念性的东西,没能完全理解,只有在今后不断实践中再总结经验。 一、流(Stream) 2、为什么需要流 3、什么地方需要使用流 4、怎样建立流 (1)基于字节输入输出,如InputStream/OutputStream 由上面可以看出,基本上针对字节操作的类都是以Stream结尾的,针对字符操作的类则是以Reader或者Writer作为结尾。这样划分下来,就会减轻不少的API学习量。 基本上进行读取或者写入操作的时候按照下面五个步骤: 根据这5个步骤,下面写个小程序来试验一下对文件的读去和写入操作。 /*从磁盘中以字节方式读取名为ball.jpg图片,并建立起之间的读取流*/ 关于随机访问以及对象的读取和写入下次再总结。 下面总结一下JFileChooser的用法 //根据File对象parent的路径和字符串child连接起来形成个新的字符串,并将其作为新File的路径名字字符串 比较常用的方法: 打开文件对话框: import java.io.File; public class FileChooserTest { public static void main(String [] args) { //首先是创建JFileChooser 对象,里面带个参数,表示默认打开的目录,这里是默认打开当前文件所在的目录。 JFileChooser file = new JFileChooser ("."); /*使用showOpenDialog()方法,显示出打开选择文件的窗口,当选择了某个文件后,或者关闭此窗口那么都会返回一个 整型数值,如果返回的是0,代表已经选择了某个文件。如果返回1代表选择了取消按钮或者直接关闭了窗口*/ /*JFileChooser.APPROVE_OPTION是个整型常量,代表0。就是说当返回0的值我们才执行相关操作,否则什么也不做。 /*获得你选择的文件绝对路径。并输出。当然,我们获得这个路径后还可以做很多的事。 System.out.println("你已取消并关闭了窗口!"); /*因为我们需要创建一个文件的过滤器,以便让文件对话框显示我们指定的文件。这里我们就以Excel文件和exe文件举例。 那么要做到这点我们就需要重写FileFilter 类的accept来设置相关的过滤器。这个继承类你可以写成外部类、内部类甚至是 匿名内部类。我这里写成了一个内部类的形式。因为是在main方法使用他,因此这个类也要定义成 静态的。 private static class ExcelFileFilter extends FileFilter { String ext; //构造方法的参数是我们需要过滤的文件类型。比如excel文件就是 xls,exe文件是exe. ExcelFileFilter(String ext) { this.ext = ext; /*这个方法就是重写 FileFilter 类的方法,参数是File对象,一般这个参数是如何传入的我们可以不用关心。他返回一个布尔型。如果为真表示该文件符合过滤设置,那么就会显示在当前目录下,如果为假就会被过滤掉。 public boolean accept(File file) { //首先判断该目录下的某个文件是否是目录,如果是目录则返回true,即可以显示在目录下。 if (file.isDirectory()) //获得某个文件的文件名,然后使用lastIndexOf()来获得这个文件名字符串中‘.‘这个字符最后一次出现的位置。并且通过它返回的一个整型来判断该文件是否符合*.*这中文件+文件名的格式,如果不符合那么就不显示这个文件。如果符合,那么就将‘.‘字符后面的字符串提取出来与过滤的文件名相比较,如果相等则符合该文件格式,并显示出来。如果不相等那么就将其过滤掉。*/ String fileName = file.getName(); if (index > 0 && index < fileName.length() - 1) /*这个方法也是重写FileFilter的方法,作用是在过滤名那里显示出相关的信息。这个与我们过滤的文件类型想匹配,通过这些信息,可以让用户更清晰的明白需要过滤什么类型的文件。*/ public String getDescription() { if (ext.equals("xls"))
打开选择文件的对话框就建立好了。但是上面的程序还有瑕疵。因为只有当用户点取消或关闭该窗口时才不会执行任何操作。而如果用户在对话框里输入的文件在当前目录中不存在时,那么窗口依然会关闭,这时可能就需要在程序中再来做判断。那么可不可以在当用户输入错误的文件名后,窗口不会关闭,而是不执行任何操作或者弹出个对话框提示用户,可以看看大多数window程序中的选择对话框都是这么做的,其实要实现这个功能也不难, 只需要再重写一下JFileChooser类的approveSelection()方法就行了。 我们将上面的程序做下修改,首先还是需要创建一个继承于JFileChooser的类,这个类可以写成外部或者内部类,我们这里依然写为内部类,注意,如果需要在静态方法中调用它,则需要将它设置为静态的。 private static class MyChooser extends JFileChooser { /** File file = new File(getSelectedFile().getPath()); if (file.exists()) } 把上面这段代码添加进刚才的类里面,然后把 JFileChooser file = new JFileChooser (".");改成 JFileChooser file = new MyChooser ("."); 好了,现在我们就可以在不关闭该对话框的情况下判断用户的输入是否错误了。还可以加入正则表达式,判断用户输入是否符合规定,操作方式按照这个框架来写就没问题了。这里不再赘述。下面是保存对话框! 保存对话框: 其实保存对话框和打开文件对话框在使用上没什么区别,他们都是使用同一个类JFileChooser,因为在swing当中打开和保存对话框不会做出任何对文件进行处理的功能,所有的这些功能需要我们自己去实现,而仅仅是提供了1个这样的窗口模型而已。因此这两种窗口其实只是将按钮的标签进行了替换而已 。创建他们唯一的区别就是打开是调用showOpenDialog()方法,保存则是调用showSaveDialog(),创建形式几乎一样。我们在使用他们的时候就需要分别对这两种窗口的返回后进行不同的处理,设置过滤器是一样的,因此过滤器我们就复用上面打开文件窗口的方法,但是在判断输入保存文件是否在当前目录下时,我们需要做出不一样的处理。当用户输入了与当前目录相同的文件名后,要弹出对话框询问用户是否需要覆盖原文件,如果用户选择否,那么返回保存文件的对话框允许用户继续选择或者输入保存的文件名。 下面我只需要修改上面代码的两个地方就能够达到目的。首先将修改一下MyChooser这个类 private static class MyChooser extends JFileChooser { /*同样是覆盖approveSelection方法,首先获得输入文件的路径,然后判断其是否在当前目录下,如果存在,那么弹出对话框询问是否需要覆盖当前文件,如果选择取消,则回到保存对话框,用户可以继续进行保存的操作。*/ 再把上面的 int result = file.showOpenDialog(null); 改成 int result = file.showSaveDialog(null); 两个基本的选择文件对话框就创建完成了。 如果需要多选,那么要设置setMultiSelectionEnabled(true) 那么File file = this.getSelectedFile();这句我们就要改成 File [] files = this.getSelectedFiles(); files这个数组里面就存放的是选择多个文件File对象,然后我们只需要对这个数组进行操作即可。 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1531654 |
|