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

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

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

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

具体代码实现如下:

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importjava.io.FilenameFilter;

importjava.io.IOException;

publicclassJava2Jad {

//为了保证下面的匿名内部类能够访问替换前后的后缀名

privateString sName;

privateString tName;

/**

* 将后缀名为sourceName的文件转换为targerName文件

*

* sourceDir : 源目录

* targetDir :目标目录

* sourceName : 源文件后缀名

* targerName :转换后文件的后缀名

*

* 在获取sourceDir目录中所有文件的同时,对listFiles()方法用匿名内部类的形式

* 添加一个FilenameFilter过滤器,实现该接口中的accept()方法,这样就能将该目

* 录 下后缀名不是sourceName的文件给过滤掉!

*/

publicvoidjava2jad(File sourceDir, File targetDir, String sourceName,

String targetName)throwsIOException {

this.sName = sourceName;

this.tName = targetName;

File[] fileList = sourceDir.listFiles(newFilenameFilter() {

publicbooleanaccept(File dir, String name) {

return(name.endsWith(Java2Jad.this.sName));

}

});

FileInputStream fis =null;

FileOutputStream fos =null;

File newFile =null;

for(File f : fileList) {

// 获取每一个源文件的输入流

fis =newFileInputStream(f);

/**

* 运用String类中的replaceAll()方法,给定正则表达式,

* 将文件名中的后缀名sName替换成tName

*/

String targetFileName = f.getName().replaceAll(

"\\" + sName + "$", tName);

newFile =newFile(targetDir, targetFileName);

if(!newFile.exists()) {

newFile.createNewFile();

}

//获取输出到目标文件的输出流

fos =newFileOutputStream(newFile);

//将输入流、输出流作为参数传进函数进行文件拷贝

copyFile(fis, fos);

fis.close();

fos.close();

}

}

/**

* 根据输入流、输出流来拷贝文件

*

* @param fis : 源文件的输入流

* @param fos : 到目标文件的输出流

*/

privatevoidcopyFile(FileInputStream fis, FileOutputStream fos) {

inttemp =0;

try{

while((temp = fis.read()) != -1) {

fos.write(temp);

}

}catch(IOException e) {

e.printStackTrace();

}

}

publicstaticvoidmain(String[] args)throwsIOException {

if(args.length !=4) {

System.out.println("输入的参数个数不对!例如:Java2Jad F:\\source F:\\target txt jad");

System.exit(0);

}

File sourceDir =newFile(args[0]);

File targetDir =newFile(args[1]);

//后缀名是有个“.”的,切记加进来

String sourceName ="."+ args[2];

String targetName ="."+ args[3];

if(!sourceDir.exists()) {

System.out.println(sourceDir +" 源目录不存在!");

System.exit(0);

}elseif(!sourceDir.isDirectory()) {

System.out.println(sourceDir +" 不是一个文件夹!");

System.exit(0);

}

if(!targetDir.exists()) {

System.out.println("目标目录不存在!创建新目录!");

targetDir.mkdir();

}

newJava2Jad().java2jad(sourceDir, targetDir, sourceName, targetName);

System.out.println("文件改名并复制成功!");

}

}

源目录:

a0e4f08cf9afd9d5ae4fb9ca2445d611.png

目标目录:

f74ff7c1b81cb2049ca0a848d21d82bf.png

测试:

5264f22c3f5f4026709a28507bee0807.png

测试结果:

e8d3f8f4c721678f6dfdf06c6737a5d2.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的文件过滤器接口主要有两种:`FileFilter`和`FilenameFilter`。它们都可以用于过滤文件,让我们只获取需要的文件。 `FileFilter`过滤器接口定义了一个用于判断文件是否符合要求的方法`accept(File pathname)`,该方法返回一个布尔值,符合要求的文件返回`true`,否则返回`false`。下面是一个简单的实现示例: ```java import java.io.File; import java.io.FileFilter; public class MyFileFilter implements FileFilter { private String ext; public MyFileFilter(String ext) { this.ext = ext; } @Override public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(ext)) { return true; } return false; } } ``` 上面的代码实现了一个过滤器,只保留指定扩展名的文件。使用方法如下: ```java public static void main(String[] args) { File dir = new File("C:/mydir"); FileFilter filter = new MyFileFilter(".txt"); File[] files = dir.listFiles(filter); for (File f : files) { System.out.println(f.getName()); } } ``` 上面的代码将输出`C:/mydir`目录下所有扩展名为`.txt`的文件名。 `FilenameFilter`过滤器接口也定义了一个用于判断文件是否符合要求的方法`accept(File dir, String name)`,该方法返回一个布尔值,符合要求的文件返回`true`,否则返回`false`。下面是一个简单的实现示例: ```java import java.io.File; import java.io.FilenameFilter; public class MyFilenameFilter implements FilenameFilter { private String ext; public MyFilenameFilter(String ext) { this.ext = ext; } @Override public boolean accept(File dir, String name) { if (name.endsWith(ext)) { return true; } return false; } } ``` 使用方法与`FileFilter`类似,只是需要把过滤器传递给`File`类的`list()`或`listFiles()`方法,如下所示: ```java public static void main(String[] args) { File dir = new File("C:/mydir"); FilenameFilter filter = new MyFilenameFilter(".txt"); String[] files = dir.list(filter); for (String name : files) { System.out.println(name); } } ``` 上面的代码将输出`C:/mydir`目录下所有扩展名为`.txt`的文件名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值