/*
* 输入指定名字的文件(如 a.txt)
* 在E盘根目录下,遍历E盘文件 ,查找是否存在该文件
* 如果存在删除该文件,不存在显示该文件不存在
*/
public class Test2001 {
private static String s;
public static void main(String[] args) {
test1();//删除文件
}
private static void test1() {
System.out.println("请输入你要删除的文件名");
s=new Scanner(System.in).next();
File file=new File("E:/");
deleteFile(file);
}
private static void deleteFile(File file) {
File Array[]=file.listFiles();
for(File f:Array)
if(f.isFile()){//如果是文件
if(f.getName()==s){
f.delete();
System.out.println("删除文件成功");
break;
}else{//如果不是要删除的文件,跳到下一次循环
continue;
}
}else{//如果不是文件
deleteFile(file);
}
System.out.println("删除文件失败,该文件不存在");
}
}
求大神救救我,一直错,我要崩溃了
deleteFile(file);这一行报错
1、创建File对象File(String pathname):pathname录入时录入的路径字符串需要注意/和\的运用,但是由于java开发出的程序需要运用到不同的系统上,因此,一般以File.separator来代替。
2、创建File对象File(File parent,String child):此为创建文件对象的另外一种方式,parent为已创建的对象,这种情况,parent一般为文件夹的路径,child为文件的名称。
3、判断File对象是否是一个文件:isFile()返回值true为文件,false为非文件。如下程序中,由于file1对象为文件夹,非文件,返回为false;file2对象为文件,返回true。
4、文件的内容长度(占用字节):length()当前File对象所表示的文件所占用的字节量。在testFile1.txt中事先录入部分数据,file2指向的File对象,内容长度为8。
5、判断文件是否存在,在硬盘创建文件前,一般需要判断硬盘中文件是否存在,如果不存在才创建文件,这样可以避免文件重复创建。
6、文件创建:createNewFile()当File对象调用文件创建方法后,硬盘中文件才会被创建。
你程序中有个错误,并且逻辑有问题,代码修改了,如下:
public class Test2001 {private static String s;
public static void main(String[] args) {
test1();// 删除文件
}
private static void test1() {
System.out.println("请输入你要删除的文件名");
s = new Scanner(System.in).next();
File file = new File("E:/");
deleteFile(file);
}
private static void deleteFile(File file) {
File Array[] = file.listFiles();
for (File f : Array) {
if (f.isFile()) {// 如果是文件
if (f.getName().equals(s)) {
f.delete();
System.out.println("删除文件成功");
return;
}
}
}
System.out.println("删除文件失败,该文件不存在");
}
}
1.错误
判断文件名是否相等:if(f.getName()==s)
字符串判断值是否相等使用equals方法,==是比较内存地址,所以你的for一直匹对不到相同文件
2. 逻辑错误
private static void deleteFile(File file) {
File Array[] = file.listFiles();
for (File f : Array) {
if (f.isFile()) {// 如果是文件
if (f.getName() == s) { // 这里已经在比较文件是否相等
f.delete();
System.out.println("删除文件成功");
break;
} else {// 如果不是要删除的文件,跳到下一次循环
continue;
}
} else {// 如果不是文件
deleteFile(file); // 这里
}
}
System.out.println("删除文件失败,该文件不存在");
}
if (f.isFile()) {// 如果是文件
}
} else {// 如果不是文件
deleteFile(file); // 这里不需要再次deleteFile,只会迭代,按钮的逻辑,不是文件,就跳过,应该是continue
}
亲,如果回答满意,请即时采纳,你的理解是我回答的动力,谢谢!!!
追问还是有错...Exception in thread "main" java.lang.StackOverflowError
at java.io.File.list(Unknown Source)
at java.io.File.listFiles(Unknown Source)
错误解决了,就不存在异常了
if (f.isFile()) {// 如果是文件
}
} else {// 如果不是文件
deleteFile(file); // 还是这里的问题,file在上面已在操作,你在迭代,引起问题
}
判读错误,导致这里不停迭代,其实就是个死循环,然后系统异常
StackOverflowError表示堆载溢出,因为死循环,一直记录deleteFile(file)的执行信息,直到溢出
我想删除e盘下 a/b/c文件夹下的b,txt. 按你改的这个不能删除啊,不能遍历整个e盘的文件
追答你要遍历整个E下的文件??
public class Test2001 {private static String s;
static int i = 0;
private static String root = "E:\\";
public static void main(String[] args) throws IOException {
test1();// 删除文件
}
private static void test1() throws IOException {
System.out.println("请输入你要删除的文件名");
s = new Scanner(System.in).nextLine();
if (s.startsWith("\\") || s.startsWith("/")) {
s = s.substring(1);
}
s = root + s.replaceAll("/", "\\\\");
System.out.println("s=" + s);
File file = new File(root);
if (deleteFile(file)) {
System.out.println("删除文件成功");
} else {
System.out.println("删除文件失败,该文件不存在");
}
}
private static boolean deleteFile(File file) throws IOException {
File Array[] = file.listFiles();
boolean flag = false;
for (File f : Array) {
if (f.isFile()) {// 如果是文件
System.out.println(f.getCanonicalPath());
if (f.getCanonicalPath().equals(s)) {
f.delete();
flag = true;
break;
}
} else {
flag = deleteFile(f);
if (flag)
break;
}
}
return flag;
}
}
迭代,不能比较文件名,要比较全路径,所以加了路径的计算。哎
本回答被提问者采纳