黑马程序员技术交流社区
标题:
关于先复制文件后改名的reNameTo的疑问
[打印本页]
作者:
sunspot
时间:
2015-1-23 12:36
标题:
关于先复制文件后改名的reNameTo的疑问
//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,就把实体文件的后缀更改了,
请问下这个是什么原理呢?不是很清楚,请大神解答下,谢谢。
作者:
邓士林
时间:
2015-1-23 12:36
本帖最后由 邓士林 于 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);
}
作者:
huangshengsen
时间:
2015-1-24 13:52
很想拿你这10个币,看里几遍你的问题也不确定你想知道什么原理 renameTo的工作原理吗?这个真没法回答你,但是这个方法的作用你可以理解成 换一个路径指向这个实体文件呗
作者:
Mr.JUN
时间:
2015-1-25 23:17
renameTo()还是不要用吧,剪切文件不是很好~~~这个程序我写个,可能不是很完善:
import java.io.*;
import java.util.*;
/**
* 描述查找到java文件,再修改txt文件并存到相应的目录
*/
public class JavaToTxtDemo2 {
public static void main(String[] args) throws IOException {
// java文件的父路径
String srcPath = "d:\\java";
File parent = new File(srcPath);
//txt文件存放的父路径
String destPath = "D:\\useTotest\\copy\\";
ArrayList<File> list = new ArrayList<File>();
getJavaFiles(parent, list);
change(list, destPath);
}
//parent目录下所有java文件,并存放在list中
public static void getJavaFiles(File parent, List<File> list) {
File[] files = parent.listFiles();
for (File file : files) {
if (file.isDirectory()) {
getJavaFiles(file, list);
} else {
if (file.getName().endsWith(".java")) {
list.add(file);
}
}
}
}
//遍历list中的java文件,并修为txt文件
public static void change(List<File> list, String destPath) throws IOException {
BufferedReader in = null;
BufferedWriter out = null;
for (File file : list) {
String javaFilename = file.getName(); //java文件名
//txt文件名
String txtFilename = javaFilename.substring(0, javaFilename.length()-".java".length())
+ ".txt";
in = new BufferedReader(new FileReader(file));
out = new BufferedWriter(new FileWriter(destPath + txtFilename));
String line = null;
while((line = in.readLine()) != null) {
out.write(line);
out.newLine();
out.flush();
}
}
//关闭资源
in = null;
out = null;
in.close();
out.close();
}
}
复制代码
作者:
sunspot
时间:
2015-2-4 00:47
可能是我之前钻牛角尖了,其实就是这么一句api上面也有解释:public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2