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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

sunspot

中级黑马

  • 黑马币:

  • 帖子:

  • 精华:

10黑马币
//4、编写一个程序,把这个目录下的所有的带.java文件都拷贝到另一个目录总,拷贝成功后,把后缀名是.java的改成.txt

public class Test4_5 {
        public static void main(String[] args) throws IOException {
                //封装键盘录入
                File srcFile = new File("D:\\develop\\FileTest");
                //获取所有满足条件的File[]数组
                File[] fileArray = srcFile.listFiles(new FilenameFilter(){
                        public boolean accept(File dir, String name){
                                return new File(dir, name).isFile()&&name.endsWith(".java");
                        }
                });
               
                //判断目录是否存在,不存在就创建
                File destFile = new File("D:\\develop\\destFile");
                if(!destFile.exists()){
                        destFile.mkdirs();
                }
                //遍历File集合
                for(File file:fileArray){
                        String name = file.getName();

                        BufferedReader br = new BufferedReader(new FileReader(file));
                        BufferedWriter bw = new BufferedWriter(new FileWriter(new File(destFile,name)));
                        String line = null;
                        while((line = br.readLine())!=null){
                                bw.write(line);
                                bw.newLine();
                                bw.flush();
                        }
                        bw.close();
                        br.close();
                }               
                File[] destArray = destFile.listFiles();
                for(File file: destArray){
                        String name = file.getName();
                        String newName = name.replace(".java", ".jad");
                        File newFile = new File(destFile,newName);
                        file.renameTo(newFile);
                }
        }       
}
如上题
关于最后一步file.renameTo(newFile)的疑问,
File本身是一个文件和目录路径名的抽象表示形式,是对抽象路径名的一个指向。
红字中遍历的file对象也是一个个抽象路径名的指向,只不过这些指向下确实存在对应的实体文件(蓝色部分复制得到的所有.java文件),
然后红字部分根据复制到的文件的目录和newName创建的一个newFile对象,是一个抽象路径名的指向,且没有实体文件,
然后有实体文件的抽象路径名的指向file通过 .renameTo 到没有实体文件的抽象路径名newFile,就把实体文件的后缀更改了,
请问下这个是什么原理呢?不是很清楚,请大神解答下,谢谢。

最佳答案

查看完整内容

我没弄明白你说的原理是什么意思,你想知道哪些原理啊! for(File file: destArray){ String name = file.getName(); String newName = name.replace(".java", ".jad"); File newFile = new File(destFile,newName); //在目标路径下,创建一个新的文件 file.renameTo(newFile); ...

4 个回复

正序浏览
可能是我之前钻牛角尖了,其实就是这么一句api上面也有解释:public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。
回复 使用道具 举报
renameTo()还是不要用吧,剪切文件不是很好~~~这个程序我写个,可能不是很完善:
  1. import java.io.*;
  2. import java.util.*;

  3. /**
  4. * 描述查找到java文件,再修改txt文件并存到相应的目录
  5. */
  6. public class JavaToTxtDemo2 {
  7.         public static void main(String[] args) throws IOException {
  8.                 // java文件的父路径
  9.                 String srcPath = "d:\\java";
  10.                 File parent = new File(srcPath);
  11.                 //txt文件存放的父路径
  12.                 String destPath = "D:\\useTotest\\copy\\";

  13.                 ArrayList<File> list = new ArrayList<File>();
  14.                 getJavaFiles(parent, list);
  15.                 change(list, destPath);
  16.         }

  17.         //parent目录下所有java文件,并存放在list中
  18.         public static void getJavaFiles(File parent, List<File> list) {
  19.                 File[] files = parent.listFiles();

  20.                 for (File file : files) {
  21.                         if (file.isDirectory()) {
  22.                                 getJavaFiles(file, list);
  23.                         } else {
  24.                                 if (file.getName().endsWith(".java")) {
  25.                                         list.add(file);
  26.                                 }
  27.                         }
  28.                 }
  29.         }


  30.         //遍历list中的java文件,并修为txt文件
  31.         public static void change(List<File> list, String destPath) throws IOException {
  32.                 BufferedReader in = null;
  33.                 BufferedWriter out = null;
  34.                 for (File file : list) {
  35.                         String javaFilename = file.getName();        //java文件名
  36.                         //txt文件名
  37.                         String txtFilename = javaFilename.substring(0, javaFilename.length()-".java".length())
  38.                                                                  + ".txt";
  39.                         in = new BufferedReader(new FileReader(file));
  40.                         out = new BufferedWriter(new FileWriter(destPath + txtFilename));
  41.                         String line = null;
  42.                         while((line = in.readLine()) != null) {
  43.                                 out.write(line);
  44.                                 out.newLine();
  45.                                 out.flush();
  46.                         }
  47.                
  48.                 }
  49.                 //关闭资源
  50.                 in = null;
  51.                 out = null;
  52.                 in.close();
  53.                 out.close();
  54.         }
  55. }
复制代码

回复 使用道具 举报
很想拿你这10个币,看里几遍你的问题也不确定你想知道什么原理 renameTo的工作原理吗?这个真没法回答你,但是这个方法的作用你可以理解成  换一个路径指向这个实体文件呗
回复 使用道具 举报
本帖最后由 邓士林 于 2015-1-23 17:32 编辑

我没弄明白你说的原理是什么意思,你想知道哪些原理啊!
  for(File file: destArray){
                        String name = file.getName();
                        String newName = name.replace(".java", ".jad");
                        File newFile = new File(destFile,newName);         //在目标路径下,创建一个新的文件
                        file.renameTo(newFile);                                        //重新命名此文件,用法就是这样
                }
public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。
renameTo的实现:    public boolean renameTo(File dest) {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkWrite(path);
            security.checkWrite(dest.path);
        }
        return fs.rename(this, dest);
    }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马