文件名过滤器修改后缀名再复制保存的Java实现

简介:

由于Java类包并没有提供太丰富的文件操作,平时很多实用的文件操作都只能由我们自己写代码实现。下面我们来实现一个在命令提示符窗口中使用文件拷贝的操作,即将给定目录内符合要求的文件(即特定后缀名)改为另一个给定的后缀名,并存入到给定的目录下。

实现原理其实也不难,在控制台输入四个参数,分别是“源目录、目标目录、源文件后缀名、目标文件后缀名”,然后遍历源目录下是否存在符合要求(即源文件后缀名)的文件,如果有,则修改后缀名并保存到目标目录中。

这里使用接口 FilenameFilter中的accept(File dir, String name)方法来实现,具体的使用方法请参看Java帮助文档。 

具体代码实现如下:

 
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.FilenameFilter;  
  5. import java.io.IOException;  
  6.  
  7. public class Java2Jad {  
  8.       
  9.     //为了保证下面的匿名内部类能够访问替换前后的后缀名  
  10.     private String sName;  
  11.     private String tName;  
  12.  
  13.     /**  
  14.      * 将后缀名为sourceName的文件转换为targerName文件  
  15.      *   
  16.      * sourceDir : 源目录   
  17.      * targetDir :目标目录  
  18.      * sourceName : 源文件后缀名  
  19.      * targerName :转换后文件的后缀名  
  20.      *   
  21.      * 在获取sourceDir目录中所有文件的同时,对listFiles()方法用匿名内部类的形式  
  22.      * 添加一个FilenameFilter过滤器,实现该接口中的accept()方法,这样就能将该目  
  23.      * 录 下后缀名不是sourceName的文件给过滤掉!  
  24.      */ 
  25.     public void java2jad(File sourceDir, File targetDir, String sourceName,  
  26.             String targetName) throws IOException {  
  27.         this.sName = sourceName;  
  28.         this.tName = targetName;  
  29.           
  30.         File[] fileList = sourceDir.listFiles(new FilenameFilter() {  
  31.             public boolean accept(File dir, String name) {  
  32.                 return (name.endsWith(Java2Jad.this.sName));  
  33.             }  
  34.         });  
  35.  
  36.         FileInputStream fis = null;  
  37.         FileOutputStream fos = null;  
  38.         File newFile = null;  
  39.         for (File f : fileList) {  
  40.             // 获取每一个源文件的输入流  
  41.             fis = new FileInputStream(f);  
  42.  
  43.             /**  
  44.              * 运用String类中的replaceAll()方法,给定正则表达式,  
  45.              * 将文件名中的后缀名sName替换成tName  
  46.              */ 
  47.             String targetFileName = f.getName().replaceAll(  
  48.                     "\\" + sName + "$", tName);  
  49.             newFile = new File(targetDir, targetFileName);  
  50.  
  51.             if(!newFile.exists()) {  
  52.                 newFile.createNewFile();  
  53.             }  
  54.             //获取输出到目标文件的输出流  
  55.             fos = new FileOutputStream(newFile);  
  56.  
  57.             //将输入流、输出流作为参数传进函数进行文件拷贝  
  58.             copyFile(fis, fos);  
  59.  
  60.             fis.close();  
  61.             fos.close();  
  62.         }  
  63.     }  
  64.  
  65.     /**  
  66.      * 根据输入流、输出流来拷贝文件  
  67.      *   
  68.      * @param fis : 源文件的输入流  
  69.      * @param fos : 到目标文件的输出流  
  70.      */ 
  71.     private void copyFile(FileInputStream fis, FileOutputStream fos) {  
  72.         int temp = 0;  
  73.         try {  
  74.             while ((temp = fis.read()) != -1) {  
  75.                 fos.write(temp);  
  76.             }  
  77.         } catch (IOException e) {  
  78.             e.printStackTrace();  
  79.         }  
  80.     }  
  81.  
  82.     public static void main(String[] args) throws IOException {  
  83.         if (args.length != 4) {  
  84.             System.out.println("输入的参数个数不对!例如:Java2Jad F:\\source F:\\target txt jad");  
  85.             System.exit(0);  
  86.         }  
  87.  
  88.         File sourceDir = new File(args[0]);  
  89.         File targetDir = new File(args[1]);  
  90.         //后缀名是有个“.”的,切记加进来  
  91.         String sourceName = "." + args[2];  
  92.         String targetName = "." + args[3];  
  93.  
  94.         if (!sourceDir.exists()) {  
  95.             System.out.println(sourceDir + " 源目录不存在!");  
  96.             System.exit(0);  
  97.         } else if (!sourceDir.isDirectory()) {  
  98.             System.out.println(sourceDir + " 不是一个文件夹!");  
  99.             System.exit(0);  
  100.         }  
  101.  
  102.         if (!targetDir.exists()) {  
  103.             System.out.println("目标目录不存在!创建新目录!");  
  104.             targetDir.mkdir();  
  105.         }  
  106.  
  107.         new Java2Jad().java2jad(sourceDir, targetDir, sourceName, targetName);  
  108.         System.out.println("文件改名并复制成功!");  
  109.     }  

源目录:

image 

目标目录:

image

测试:

image

测试结果:

image

 

 

其实,在这个代码实现当中还有挺多不太合理、效率比较低之处,例如:复制操作中的读和写分别是直接使用了FileInputStream类中一次读一个字节的read()方法和FileOutputStream类中的write()方法,我们可以用带缓冲的高级一些的其他其他类来代替,这个在以后的文章中我再给出;另外,Java2Jad类中定义了两个String型实例变量,仅仅为了让下面的FilenameFilter匿名内部类中的accept()方法能访问而已,我个人觉得这样子处理不太好,希望各位能提出好建议互相学习。


本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/335845,如需转载请自行联系原作者

相关文章
|
5月前
|
设计模式 Java
Java设计模式【八】:过滤器模式
Java设计模式【八】:过滤器模式
24 0
|
2月前
|
Java Spring 容器
[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
|
7月前
|
Java 容器
28JavaWeb基础 - 过滤器
28JavaWeb基础 - 过滤器
26 0
|
2天前
|
Java 程序员 应用服务中间件
JavaWeb之过滤器(Filter)与监听器(Listener)
本文介绍了JavaWeb中的过滤器(Filter)和监听器(Listener)概念及其使用。过滤器主要用于拦截和处理Web资源请求,如进行编码设置、权限验证等,它在Servlet之前和之后执行。监听器则监听域对象(如ServletRequest、HttpSession、ServletContext)状态变化,分为创建/销毁监听和属性变化监听。监听器在Web.xml中注册后会在相应事件发生时自动执行,例如用于统计网站访问人数或初始化配置。
|
4月前
javaWeb过滤器Filter(二)
javaWeb过滤器Filter(二)
|
4月前
javaWeb过滤器Filter(一)
javaWeb过滤器Filter(一)
|
5月前
|
Rust Java
过滤器模式 rust和java的实现(二)
过滤器模式 rust和java的实现
38 1
|
5月前
|
设计模式 Rust Java
过滤器模式 rust和java的实现(一)
过滤器模式 rust和java的实现
34 1
|
7月前
|
SQL 监控 Java
Java中的过滤器和拦截器
Java中的过滤器和拦截器
48 0
|
8月前
|
前端开发 Java
java在过滤器中为http请求加请求头header
现在有一个需求场景是,每一个请求我都需要在请求头里面加上token这个请求头,作为一种校验机制,传统的接口可以通过设置一个全局的变量,然后通过页面携带过来(大概就是先将我们的token放在session中,写一个服务用来获取session中的token,然后主页面用ajax调用接口,将token放在隐藏域中,然后将请求头放进来,用ajax方法,这里不想洗说了),但是有一种情况是通过页面传递的并不一定都会适用所有接口,比如上传和下载的接口有时候头里面就没有token参数,可能是上传和下载是用表单提交的 这个时候如何将请求头通过后台的方法加进来? 想到用过滤器,用后台方法强制加入请求头。
98 0