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