A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谭立文 中级黑马   /  2012-9-29 22:24  /  2272 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是前天碰到的一个题目:
编写一个Java应用程序,程序运行后,要求到指定的文件夹(比如d:\work目录下以及所有子目录下)查找后缀为java的文件,取出并保存到d:\test目录下。
千万不要觉得简单,在这里提示一点,也是这个题目很容易被遗忘的一点,因为题目没有告诉你存在这种情况,而这种情况有是存在的,就是可能在不同目录下有着相同的名称的.java文件如果处理的不好就是有数据丢失,这是很严重的错误。同时  :可以很好的复习一下IO。{:soso_e129:}

评分

参与人数 1黑马币 +30 收起 理由
唐志兵 + 30 答题加分

查看全部评分

7 个回复

倒序浏览
顶一个,呵呵,路过。
回复 使用道具 举报
要注意一下,刚刚看了前面确实没想到。
回复 使用道具 举报
本帖最后由 叶征东 于 2012-9-30 01:40 编辑

import java.util.*;
import java.io.*;
public class JavaMuLu{
public static void main(String[] args)
{
            //--------------指定目录
       File dir=new File("e:\\javacx");
            //-------------目的地
       File toDir=new File("d:\\test");
       List<File> listFile=new ArrayList<File>();
       List<String> fileName=new ArrayList<String>();
       fileToList(dir,listFile,fileName);
       writeToFile(listFile,toDir);
}
                  //-------------对指定的目录进行递归,获取递归过程中所有的不同名JAVA文件.     其实List<String> fileName可以方法的内部定义
public static void fileToList(File file,List<File> listFile,List<String> fileName)
{
        File[] arr=file.listFiles();
        for(File f:arr)
        {
              if(f.isDirectory())
                   //-----------递归调用
                   fileToList(f,listFile,fileName);
             else
             {                                            //----判定是Java文件,且是不同名的Java文件
                   if(f.getName().endsWith(".java")&&(!(fileName.contains(f.getName()))))
                    {         //-------------将这些文件都存储到集合中
                          listFile.add(f);
                           fileName.add(f.getName());
                    }
             }
      }
}
//-------------将集合中的文件写入到指定目录中
public static void writeToFile(List<File> listFile,File dir)
{
        BufferedWriter bw=null;
        BufferedReader br=null;
        try
        {  
              for(File f:listFile)
              {        
                     
                                    File file = new File(dir,f.getName());
                     br = new BufferedReader(new FileReader(f));
                     bw=new BufferedWriter(new FileWriter(file));
                     String line = null;
                    while((line = br.readLine())!=null)
                    {
                          bw.write(line);
                          bw.newLine();
                          bw.flush();
                    }
   
            }
     }
     catch(IOException e)
     {
             throw new RuntimeException("文件读写异常");
      }
      finally
      {
             try
            {
                   if(br!=null)
                   br.close();
            }
            catch(IOException e)
            {
                    throw new RuntimeException("文件读取关闭异常");
            }
            try
            {
                   if(bw!=null)
                   bw.close();
            }
           catch(IOException e)
           {
                   throw new RuntimeException("文件写入关闭异常");
           }
     }  
}
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 谭立文 于 2012-9-30 00:37 编辑
叶征东 发表于 2012-9-29 23:42
import java.util.*;
import java.io.*;
public class JavaMuLu{


我粗略的看了一下你的代码,看到你有对同名文件的处理, 放在了集合里,不知道你是修改了其文件名还是怎么,我说说我自己是怎么处理的吧,在添加到d:test文件操作之前先对该文件夹进行检查,如果有.java文件我将他的文件名以及个数(初始一定是1)保存到了一个properties.ini文件中,因为可能当你第一拷贝的时候该目录下就已经存在了与改名称相同的文件了,然后再添加的时候再根据路径构造出来的File判断是否这个文件已经存在,如果存在,在文件名后添加一个复件的字样,并修改Properties中文件名称的个数。

回复 使用道具 举报
本帖最后由 叶征东 于 2012-9-30 01:27 编辑
谭立文 发表于 2012-9-30 00:23
我粗略的看了一下你的代码,看到你有对同名文件的处理, 放在了集合里,不知道你是修改了其文件名还是怎 ...

代码在MyEclipse里面写的,可以通过编译的,但是我没有运行.
这是在以前的一个练习题的基础上改的.
你说的是在目标文件夹d:\\test内文件可能存与ArrayList<File>();中的文件同名吗?这一点,我确实没有考虑到.



String fileNamePath = dir.getName()+"\\"+f.getName()+".java";   
这句话可能有问题.我改了
回复 使用道具 举报
谭立文 发表于 2012-9-30 00:23
我粗略的看了一下你的代码,看到你有对同名文件的处理, 放在了集合里,不知道你是修改了其文件名还是怎 ...

刚才我运行了,是好的
回复 使用道具 举报
頂一個,樓上的兄弟還是挺費心思的啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马