黑马程序员技术交流社区
标题:
关于修改扩展名的提问
[打印本页]
作者:
周兴华
时间:
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