/*第9题:编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt
思路:
,
1、定义一个方法,获取指定目录下的所有.java文件,如果该目录下还有文件夹,则通过递归的方法遍历所有的.java文件,
并且将最终获取的.java型文件的文件名存储到集合中
2、定义一个copy的方法,方法中通过集合的迭代依取文件名逐一对文件进行复制,因为都是纯文本型的文件,
所以用到的流是Reader和Writer流,而为了进行高效的读取,则需要建立
BufferedReader和BufferedWriter对象
*/
import java.io.*;
import java.util.*;
class Test9
{
public static void main(String[] args)
{
File fromFile=new File("E:\\test9");//制定一个源路径
File toFile=new File("E:\\testCopy9");//定义一个目的路径
List<String> list = new ArrayList<String>();//定义一个数组,用来存储获取源路径中的.java文件名
searchFile(fromFile,list);//在源路径下查找符合条件的文件名,存储到数组中;
Iterator<String> it=list.iterator();//通过数组迭代器获取文件名,进行文件复制
while(it.hasNext())
{
String files=it.next();
System.out.println(files);
copyFile(files,toFile);
}
}
//定义一个查找文件方法,接收一个源目录和一个List集合
public static void searchFile(File fromFile,List<String> list)
{
if(fromFile.exists() && fromFile.isDirectory())//判断源路径下是不是存在文件并且这是一个有效路径
{
File[] arr=fromFile.listFiles();//创建一个File型的数组,用来存储获取的文件列表
for(File files : arr)//使用高级for循环遍历数组
{
if(files.isDirectory())
searchFile(files,list);//如果获取到的文件还是一个目录则进行递归,进一步查找目录下的文件
else if(files.getName().endsWith(".java"))
list.add(files.getName());//如果是.java类型的文件则将文件名存储到数组中
else
System.out.println("查找文件失败");
System.out.println(list);
}
}
else
System.out.println("源路径无效");
}
/**/
//定义一个copy方法,接收一个源文件和一个目的文件
public static void copyFile(String from,File to)
{
BufferedReader read=null;
BufferedWriter write=null;
try
{
//通过将File对象进行字节流转换为字符流,并且作为参数传入字符读取缓冲区中,进行高效读取
read=new BufferedReader(new FileReader(new File(from)));
//将后缀名替换为.txt的文件作为copy的目的地
write=new BufferedWriter(new FileWriter(new File(to,from.replace("\\.java$",".txt"))));
String line=null;
while((line=read.readLine())!=null)//判断:如果读取流没有读到文件的结尾
{
write.write(line);//将读取到的内容写入到缓冲流中
write.newLine();//换行
write.flush();//刷新
}
}
catch (IOException e)
{
System.out.println("复制文件失败");
}
finally
{
try
{
if(read!=null)//如果关联被读取的文件成功,则在执行完毕后关闭该读取流
read.close();
if(write!=null)//如果写入流创建成功,则在执行完毕后关闭该写入流
write.close();
}
catch (IOException e)
{
System.out.println("关闭流失败");
}
}
}
}
今早自己修改了一下copyFile方法的代码,昨天是由于在这个方法中给要读取的文件指定了目录,但是由于在指定目录下还有子目录,所以在copy过程中没有顺利的读取到子目录下的内容,因为在查找文件步骤已经将所有符合条件的文件名存储到List集合中,所以只需将List中的文件名作为new File()关联到读取流中即可,不需要限定读取流的目录。
目前属于初学阶段,发现问题和处理问题的敏感度还是不够好,希望以后与大家随时交流 |