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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周兴华 中级黑马   /  2012-8-18 18:32  /  2079 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

相信有许多人有做过这个题目:编写一个程序,将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();
   }
  }
}
}

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 新人鼓励!

查看全部评分

5 个回复

倒序浏览
本帖最后由 徐小骥 于 2012-8-18 18:49 编辑

可以啊!知道了源文件不就能得到文件名么?假设这个文件的文件名为11.java.java另一个文件名为11.java
采用字符串分割出来的内容放入数组中可以将文件名分割为11  java java 和 11 java 这时候只需要将数组的最后一个元素java改为jad 再将这个数组拼接成字符串作为文件的文件名。问题就解决了!这是思路,具体的代码就由楼主自己写了!

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
我想应先加个判断,用subString截取下文件名末尾四个字符的字符串是不是.java.这样可以避免其它不会被更改吧
回复 使用道具 举报
这个不要用replaceAll这个方法,replaceAll(String regex, String replacement)是使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
                StringBuilder sb=f.getName();
                  sb.delete(sb.length()-5, sb.length());
                 sb.append(".jad");
这样处理即可满足你的要求!!
回复 使用道具 举报
因为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";
回复 使用道具 举报
问题已解决。按楼上同学提出的方法我都试写了代码,都能实现,谢谢了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马