黑马程序员技术交流社区

标题: 要用递归? [打印本页]

作者: hysnxdss    时间: 2016-9-26 21:13
标题: 要用递归?
编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,
拷贝成功后,把后缀名是.java的改成.txt
作者: hysnxdss    时间: 2016-9-27 12:50
大神们呢???
这道题怎么做呢?
思路是什么
作者: babysa    时间: 2016-9-27 12:56
这不是类似我们昨天作业吗。。。。。不会是我们班同学吧,嘻嘻
作者: babysa    时间: 2016-9-27 12:59
递归是必须的   用过滤器把.java文件都加载复制   再遍历复制过来的文件夹   listFiles()差不多这个方法  方法名有点忘了
作者: hysnxdss    时间: 2016-9-27 16:04
babysa 发表于 2016-9-27 12:56
这不是类似我们昨天作业吗。。。。。不会是我们班同学吧,嘻嘻

大神哪个班的
作者: 煮酒拭剑赏美人    时间: 2016-9-27 16:13
要递归,因为传入的是一个文件夹路径,文件夹里面可能有文件和文件夹,如果是符合.java的文件就改它后缀,如果是文件夹的话就继续调用方法判端和修改,然后就是无限的递归了......
作者: Fate_stay    时间: 2016-9-27 17:18
我前几天刚做过这道题,关键是: 先复制, 后改名
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
题目:
        编写一个程序,将指定目录下所有.java文件拷贝到另一个目录中,
        并将扩展名改为.txt       
思路:
        1、用File对象封装目录
        2、通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象数组
        3、遍历这个File数组,得到每一个File对象
        4、判断该File对象是否是文件
                a、如果是文件
                b、继续判断是否以.java结尾
                        是:先改名后复制文件
                        否:不复制
                       
        总结: 先复制, 后改名
*/
public class Prictice2 {
        public static void main(String[] args) throws IOException {
                File file = new File("D:\\new_test");
                // 调用方法,遍历文件或文件夹,将所有.java后缀的改为.txt,随后复制给E盘Test文件夹中
                lookFiles(file);
                System.out.println("先复制.java文件,随后写入文件夹Test时,将文件后缀写为: .txt, 完毕");
        }

        private static void lookFiles(File file) throws IOException {
                // 使用listFiles()遍历文件
                File[] files = file.listFiles();
                for (File f : files) {
                        if(f.isFile()) {
                                if(f.getName().endsWith(".java")) {
                                        // 取得它的小数点的角标
                                        int index = f.getAbsolutePath().lastIndexOf(".");
                                        // 利用角标,截取字符串
                                        String str = f.getAbsolutePath().substring(index);
                                        // 将.java后缀 替换成 .txt
                                        String newFileName = f.getName().replace(str, ".txt");
                                       
                                        // renameTo(File f)方法怎么用? 答: 里面传文件
                                        // 调用拷贝方法
                                        copyFiles(f, newFileName);
                                }
                        } else {
                                // 递归调用方法,是文件夹的话继续遍历
                                lookFiles(f);
                        }
                }
        }
        // 复制文件方法
        private static void copyFiles(File file, String newFileName) throws IOException {
                File newFile = new File("E:\\Test", newFileName);

                // 1.创建流
                BufferedReader br = new BufferedReader(new FileReader(file));
                BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));
                // 2.写入数据
                // a.声明有效长度
                int len;
                // b.声明字符数组
                char[] ch_arr = new char[1024];
                while((len = br.read(ch_arr)) != -1) {
                        // 写入数据
                        bw.write(ch_arr, 0, len);
                       
                }
                // 3.关闭资源
                bw.close();
                br.close();
        }
}

作者: bluehat    时间: 2016-9-27 21:08
其实用Files类的话要比旧的File类迭代目录要容易一些,Files类设计了可以把目录生成一个Iterable迭代器对象,还可以用glob模式过滤文件,glob的模式和windows的通配符很相似,像要找以java结尾的文件用*.java就可以了非常方便
作者: 郑大仙丶    时间: 2016-9-27 22:19
同学吧..........和我作业一模一样...

这道题.
要用递归,最主要的是要创建文件夹.
作者: babysa    时间: 2016-9-28 22:43
hysnxdss 发表于 2016-9-27 16:04
大神哪个班的

没有大神  javase  双元
作者: zhangyiling5    时间: 2016-9-28 23:55
[Java] 纯文本查看 复制代码
public class Test {

        /**
         *
         * @author ZhangYiLing
         *
         */
        public static void main(String[] args) throws IOException {
                //源文件目录
                File srcName = new File("D:\\文档");
                //目标文件目录
                File destName = new File("E:\\test4");
                //判断目的地文件夹是否存在,如不存在则创建它
                if (!destName.exists()) {
                        destName.mkdir();
                }
               
                //调用文件夹复制功能
                copyFolder(srcName,destName);
        }

        private static void copyFolder(File srcName, File destName) throws IOException {
                //判断srcName对象是否为文件夹,如果不是则复制里面的所有文件.
                if (srcName.isDirectory()) {
                        //建立目的地文件夹路径
                        File newFolder = new File(destName,srcName.getName());
                        //创建目的地文件夹
                        newFolder.mkdir();
                        //获取源地址文件夹数组
                        File [] folderArray = srcName.listFiles();
                        //使用增强for循环获取源地址每一个文件夹
                        for(File file: folderArray) {
                                //使用递归,继续获取源地址文件夹路径名称后创建到目的地路径文件夹
                                copyFolder(file,newFolder);
                        }
                       
                // 过滤非java文件
                } else if (srcName.isFile() && srcName.getName().endsWith(".java")){
                        // 将java文件的后缀名替换为txt
                        String destTxt = srcName.getName().replace(".java", ".txt");
                        //创建一个新的文件对象用于指定输出文件路径
                        File newFile = new File(destName,destTxt);
                        copyFile(srcName,newFile);
                }
        }

        private static void copyFile(File srcName, File newFile) throws IOException {
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcName));
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
               
                byte [] bys = new byte[1024];
                int len = 0;
                while((len = bis.read(bys)) != -1){
                        bos.write(bys,0,len);
                }
               
                bos.close();
                bis.close();
        }
}

作者: a5433yzj    时间: 2016-9-28 23:58
以为目前学到的知识来说,是需要用递归的
作者: hysnxdss    时间: 2016-9-29 21:29
Fate_stay 发表于 2016-9-27 17:18
我前几天刚做过这道题,关键是: 先复制, 后改名
import java.io.BufferedReader;
import java.io.BufferedWr ...

可以,可以,很强,比我写的好多啦,受教啦
作者: hysnxdss    时间: 2016-9-29 21:30
babysa 发表于 2016-9-28 22:43
没有大神  javase  双元

我也是  javase  双元  2
作者: hysnxdss    时间: 2016-9-29 21:42
郑大仙丶 发表于 2016-9-27 22:19
同学吧..........和我作业一模一样...

这道题.

javase  双元 2期   复制一个多级文件夹,
该怎么做呢?
作者: 暮雨微凉    时间: 2016-9-29 22:02
还没学到呢,看看不说话,不过感觉好难的样子
作者: 杜亚超    时间: 2016-9-29 22:18
package cn.itcast.demo5;  import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Work4 {          /*          * 将用户输入在控制台上的指定路径下所有的.txt 文件复制到 c盘下随意目录          * (你可以自 己指定路径)并在复制后将.txt 后缀名更改成.java后缀名           */         public static void copyFile(File file,File newFile) throws IOException{                 //定义一个字符缓冲区输入流                 BufferedReader br=new BufferedReader(new FileReader(file));                 //定义一个字符缓冲区输出流                 BufferedWriter bw=new BufferedWriter(new FileWriter(newFile));                 String line=null;                 while((line=br.readLine())!=null){                         bw.write(line);                         bw.newLine();                         bw.flush();                 }                 br.close();                 bw.close();                                           }         public static void main(String[] args) throws IOException {                         //封装目录                 File resFile=new File("F:\\新建文件夹 (2)\\txt");                 File desFile=new File("F:\\新建文件夹 (2)\\demo");                 //如果desFile不存在创建一个                 if(!desFile.exists()){                         desFile.mkdir();                 }                 File[] fileArray=resFile.listFiles(new FileFilter() {                         @Override                         public boolean accept(File f) {                                 if(f.isFile()){                                         if(f.getName().endsWith(".txt")){                                                 return true;                                         }                                 }                                 return false;                         }                 });                 for (File file : fileArray) {                         File newFile=new File(desFile,file.getName());                         copyFile(file,newFile);                 }                 //在目的下改名                 File[] files=desFile.listFiles();                 for (File file : files) {                         File newFile=new File(desFile,file.getName().replace(".txt", ".java"));                         file.renameTo(newFile);                 }                          } }
作者: 杜亚超    时间: 2016-9-29 22:19
package cn.itcast.demo5;  import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Work4 {          /*          * 将用户输入在控制台上的指定路径下所有的.txt 文件复制到 c盘下随意目录          * (你可以自 己指定路径)并在复制后将.txt 后缀名更改成.java后缀名           */         public static void copyFile(File file,File newFile) throws IOException{                 //定义一个字符缓冲区输入流                 BufferedReader br=new BufferedReader(new FileReader(file));                 //定义一个字符缓冲区输出流                 BufferedWriter bw=new BufferedWriter(new FileWriter(newFile));                 String line=null;                 while((line=br.readLine())!=null){                         bw.write(line);                         bw.newLine();                         bw.flush();                 }                 br.close();                 bw.close();                                           }         public static void main(String[] args) throws IOException {                         //封装目录                 File resFile=new File("F:\\新建文件夹 (2)\\txt");                 File desFile=new File("F:\\新建文件夹 (2)\\demo");                 //如果desFile不存在创建一个                 if(!desFile.exists()){                         desFile.mkdir();                 }                 File[] fileArray=resFile.listFiles(new FileFilter() {                         @Override                         public boolean accept(File f) {                                 if(f.isFile()){                                         if(f.getName().endsWith(".txt")){                                                 return true;                                         }                                 }                                 return false;                         }                 });                 for (File file : fileArray) {                         File newFile=new File(desFile,file.getName());                         copyFile(file,newFile);                 }                 //在目的下改名                 File[] files=desFile.listFiles();                 for (File file : files) {                         File newFile=new File(desFile,file.getName().replace(".txt", ".java"));                         file.renameTo(newFile);                 }                          } }
作者: CreScert    时间: 2016-10-1 00:23
要用递归,比较方便点,还是推荐递归吧
作者: wo1026756529    时间: 2016-10-1 00:39
基础班23天的例题改一下,应该是Test3的代码
作者: 一半的留言    时间: 2016-10-1 02:06
[Java] 纯文本查看 复制代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Demo2 {

        private static Scanner sc = new Scanner(System.in);
        private static File copy;

        /**
         * @param args
         */
        public static void main(String[] args) {

                /*
                 * 4、编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,拷贝成功后,把后缀名是.java的改成.txt。
                 *
                 * 解题思路: 1.使用键盘录入接收一个文件夹路径, 输入正确则返回一个文件夹路径, 不正确则提示并 死循环接收.
                 *
                 * 2.再让其输入一个存放路径,跟第1步相同 3.再使用递归方法查询指定目录下的文件,如果是文件夹,就递归调用 4.如果是文件,就判断
                 * 如果是.java文件,如果是.java文件则使用拷贝, 使用高效的字节读取流将文件读取, 再使用高效的字节输出流将文件名修改并复制
                 *
                 * 其他的文件就不搭理
                 */

                System.out.println("请输入要被拷贝的文件夹路径:");
                File f = getPath();
                System.out.println("请输入要复制到指定的文件夹路径:");
                copy = getPath();

                digui(f);

        }

        private static void digui(File f) {
                /**
                 * * 3.再使用递归方法查询指定目录下的文件,如果是文件夹,就递归调用 4.如果是文件,就判断
                 * 如果是.java文件,如果是.java文件则使用拷贝, 使用高效的字节读取流将文件读取, 再使用高效的字节输出流将文件名修改并复制
                 *
                 * 其他的文件就不搭理
                 */
                File[] listFiles = f.listFiles();
                for (File file : listFiles) {
                        if (file.isDirectory()) {
                                digui(file);// 如果是文件夹,则递归调用
                        } else {
                                /**
                                 * 4.如果是文件,就判断 如果是.java文件,如果是.java文件则使用拷贝, 使用高效的字节读取流将文件读取,
                                 * 再使用高效的字节输出流将文件名修改并复制
                                 */
                                if(file.getName().endsWith(".java")){
                                        System.out.println(file.getName());
                                        try {
                                                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                                                File name = new File(copy,file.getName().replace(".java", ".txt"));
                                                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name));
                                               
                                                int b;
                                                while((b = bis.read()) != -1){
                                                        bos.write(b);
                                                }
                                                bis.close();
                                                bos.close();
                                               
                                        } catch (Exception e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                }
                        }
                }
        }

        private static File getPath() {

                while (true) {
                        // 如果不是正确的路径,则提示请输入正确的路径
                        File file = new File(sc.nextLine());
                        if (!file.exists()) {
                                System.out.println("请输入正确的路径");
                        } else if (file.isFile()) {
                                System.out.println("你输入的是文件路径,请输入文件夹路径");
                        } else {
                                return file;
                        }
                }
        }

}

作者: chensc    时间: 2016-10-1 09:38
学习学习!
作者: 读书可以当饭吃    时间: 2016-10-1 10:50
是的,要遍历所有子文件夹嘛
作者: 愿望变美    时间: 2016-10-2 16:11
[Java] 纯文本查看 复制代码
        public static void main(String[] args) throws IOException {
                File dir = getDir();//键盘录入文件夹
                File dest = new File("D:\\day");//默认目的地文件夹
                dest.mkdirs();
                resetTo(dest,dir);//递归调用
        }

        private static void resetTo(File dest, File dir) throws IOException {
                File[] subfiles = dir.listFiles();
                if(subfiles == null){//排除拒绝访问的文件以免出错
                        return;
                }
                for (File f : subfiles) {
                        String name = f.getName();
                        if(f.isFile() && name.endsWith(".java")){//寻找".java"结尾的文件
                                File d = new File(dest,name.replace(".java", ".txt"));//用目的地文件夹和改后的文件名创建新文件
                                FileReader fr = new FileReader(f);
                                FileWriter fw = new FileWriter(d);
                                int len;
                                char[] chs = new char[1024];
                                while((len = fr.read(chs)) != -1){//将文件上的数据读取到字符数组中
                                        fw.write(chs, 0, len);                //将字符数组中的数据写到文件上
                                }
                                fr.close();
                                fw.close();
                        }else if(f.isDirectory()){//若是文件夹就递归,其他情况继续进入下一循环
                                resetTo(dest,f);
                        }
                }
        }

        private static File getDir() {
                Scanner sc = new Scanner(System.in);
                while(true){
                        String line = sc.nextLine();
                        File dir = new File(line);
                        if(!dir.exists()){
                                System.out.println("格式错,文件不存在");
                        }else if(dir.isFile()){
                                System.out.println("这是文件夹,请重录");
                        }else{
                                return dir;
                        }
                }
        }


作者: markiyangliu    时间: 2016-10-2 23:54
就是要递归!
作者: Daveweil    时间: 2016-10-3 13:22
Fate_stay 发表于 2016-9-27 17:18
我前几天刚做过这道题,关键是: 先复制, 后改名
import java.io.BufferedReader;
import java.io.BufferedWr ...

少创建一个文件夹吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2