黑马程序员技术交流社区

标题: 关于修改扩展名的提问 [打印本页]

作者: 周兴华    时间: 2012-8-18 18:32
标题: 关于修改扩展名的提问
相信有许多人有做过这个题目:编写一个程序,将d:\java 目录下的所有.java 文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad。
以下代码是我做这个题目是写的,正常情况下能够实现题目的要求。但是如果文件名为Test.java.java时,运行这个程序会将文件名改为Test.jad.jad。
我想请问大家是否有办法只改变文件的扩展名,而不会将文件名也改掉?
public class Test9 {
public static void main(String[] args) throws Exception{
  File srcDir = new File("d:\\java");
  //判断文件夹是否存在
  if(!(srcDir.exists() && srcDir.isDirectory())){
   throw new Exception("目录不存在");
  }
  //过滤出以".java"为结尾的文件
  File[] files = srcDir.listFiles(new  FilenameFilter(){
   public boolean accept(File dir,String name){
    return name.endsWith(".java");
   }
  });
  File destDir = new File("d:\\jad");
  //判断目录是否存在,如果不存在则创建一个
  if(!destDir.exists()){
   destDir.mkdir();
  }
  //循环将d:\java 目录下的所有.java 文件复制到d:\jad 目录下
  for(File f : files){
   FileInputStream fis=new FileInputStream(f);
   //将原来文件的扩展名从.java 改为.jad
   String destFilename=f.getName().replaceAll(".java", ".jad");
   FileOutputStream fos=new FileOutputStream(new File(destDir,destFilename));
   //调用复制文件方法
   copy(fis,fos);
  }
}
public static void copy(InputStream is,OutputStream os){
  try{
   byte[] buf=new byte[1024];
   int len=0;
   while((len=is.read(buf))!=-1){
    os.write(buf, 0, len);
   }
   os.flush();//刷新输出流
  }catch(FileNotFoundException e){
   e.printStackTrace();
  }catch(IOException e){
   e.printStackTrace();
  }finally{  //关闭所有IO对象流
   try{
    if(is != null){
     is.close();
    }
   }catch(Exception e){
    e.printStackTrace();
   }
   try{
    if(os != null){
     os.close();
    }
   }catch(Exception e){
    e.printStackTrace();
   }
  }
}
}

作者: 徐小骥    时间: 2012-8-18 18:40
本帖最后由 徐小骥 于 2012-8-18 18:49 编辑

可以啊!知道了源文件不就能得到文件名么?假设这个文件的文件名为11.java.java另一个文件名为11.java
采用字符串分割出来的内容放入数组中可以将文件名分割为11  java java 和 11 java 这时候只需要将数组的最后一个元素java改为jad 再将这个数组拼接成字符串作为文件的文件名。问题就解决了!这是思路,具体的代码就由楼主自己写了!
作者: 刘文龙    时间: 2012-8-18 18:45
我想应先加个判断,用subString截取下文件名末尾四个字符的字符串是不是.java.这样可以避免其它不会被更改吧
作者: 杜鹏云    时间: 2012-8-18 19:06
这个不要用replaceAll这个方法,replaceAll(String regex, String replacement)是使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
                StringBuilder sb=f.getName();
                  sb.delete(sb.length()-5, sb.length());
                 sb.append(".jad");
这样处理即可满足你的要求!!
作者: 曹晓涵    时间: 2012-8-18 19:37
因为java.lang.String类中的replaceAll()方法会替换掉字符串中所有匹配的子字符串。
f.getName()获取文件名"Test.java.java",与".java"匹配的子字符串有两个,所有这俩个子字符串都会被替换为".jad",新的文件名变为“Test.jad.jad”
由于String类中没有直接替换最后一个匹配的子字符串的方法,但可以通"Test.java.java".lastIndexOf("java")获取最后一个匹配的子字符串"java"的索引位置.
通过,"Test.java.java".substring(0,"Test.java.java".lastIndexOf(".java"))获取不带后缀的文件名,加上新的后缀名".jad"就是替换后的完整文件名。
将     String destFilename=f.getName().replaceAll(".java", ".jad");
改为   String destFilename=f.getName().substring(0,f.getName().lastIndexOf(".java"))+".jad";
作者: 周兴华    时间: 2012-8-19 19:48
问题已解决。按楼上同学提出的方法我都试写了代码,都能实现,谢谢了!




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