黑马程序员技术交流社区

标题: 使用键盘录入一个文件路径,并统计文件路径中所有文件的... [打印本页]

作者: Lws    时间: 2016-9-6 17:10
标题: 使用键盘录入一个文件路径,并统计文件路径中所有文件的...
使用键盘录入一个文件路径,并统计文件路径中所有文件的大小,在输入一个c:或者其他盘的时候,他会报错怎么解?

作者: LShu    时间: 2016-9-6 17:10
这个问题主要是有隐藏文件的存在,才会出现错误的,楼主可以在读取文件的是判断是否是一个隐藏文件,是的话就跳过就好了,同样也可以使用异常处理try{}catch() {}方法来解决,希望可以帮到你.
/*
* 使用键盘录入一个文件路径,并统计文件路径中所有文件的大小
*
* 分析:
* 1,创建一个键盘录入对象
* 2,使用while无限循环
* 3,将键盘录入的文件路径存放到一个File文件中
* 4,判断录入的文件是否是一个文件夹路径
*                 是:返回这个文件夹路径
*                 否:判断这个路径是否存在,如果存在就判断是否是一个文件路径,都给予提示
* 5,定义一个获取所有文件长度的方法
* 6,定义一个长度变量
* 7,将获取到的文件和文件夹存放到一个File[]数组中
* 8,遍历数组,判断这个File[]数组中存放的是否是文件
*                 是:将其长度统计
*                 否:进行递归调用,获取文件夹中文件
* 9,返回所有文件的长度
*/
package com.heima.practise;

import java.io.File;
import java.util.Scanner;

public class Test01 {
        public static void main(String[] args) {
                File dir = getDir();
                long length = getFileLongth(dir);
                System.out.println(length);
        }
       
        //定义一个获取文件夹路径的方法
        public static File getDir() {
                //1,创建一个键盘录入对象
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入一个文件夹路径:");
                //2,使用while无限循环
                while(true){
                        //3,将键盘录入的文件路径存放到一个File文件中
                        String line = sc.nextLine();
                        File dir = new File(line);
                        /*
                         * 4,判断录入的文件是否是一个文件夹路径
                         *                 是:返回这个文件夹路径
                         *                 否:判断这个路径是否存在,如果存在就判断是否是一个文件路径,都给予提示
                         */
                        if (!dir.exists()) {
                                System.out.println("您输入的是一个文件夹路劲,请输入一个文件夹路径:");
                        }else if (dir.isFile()) {
                                System.out.println("您输入的是一个文件路径,请重新输入一个文件夹路径:");
                        }else {
                                return dir;
                        }
                }
        }
       
        //5,定义一个获取所有文件长度的方法
        public static long getFileLongth(File dir) {
                //6,定义一个长度变量
                long len = 0;
                // 7,将获取到的文件和文件夹存放到一个File[]数组中
                File[] arr = dir.listFiles();
                /*
                 *  8,遍历数组,判断这个File[]数组中存放的是否是文件
                 *                 是:将其长度统计
                 *                 否:进行递归调用,获取文件夹中文件
                 */
                        for (File file : arr) {
                                if (file.isFile()) {
                                        len = len + file.length();
                                }else {
                                        //判断是否是一个隐藏的文件或者是一个隐藏的文件夹
                                        if (file.isHidden()) {
                                                System.out.println(file.getName() + "是一个隐藏的文件或者文件夹");
                                                //停止本次的for循环,继续下一次的for循环
                                                continue;                       
                                        }
                                        len = len + getFileLongth(file);
                                }
                        }
                //9,返回所有文件的长度
                return len;
        }
}



作者: heh8921    时间: 2016-9-6 18:49
比如文件夹路径是C:\\
File dir = new File("C:\\");
File[] subFiles = dir.listFiles();
在循环数组之前加个判断就行了
if (subFiles != null) {
     for (File subFile : subFiles) {
     }
}
如果是加密文件夹,不能读取文件夹内容,数组就为null,不会进if语句执行.这样就不报错了.
作者: seedseed555    时间: 2016-9-6 23:44
来学习了
作者: seedseed555    时间: 2016-9-6 23:45
来学习了
作者: flydream    时间: 2016-9-7 00:09
本帖最后由 flydream 于 2016-9-7 00:15 编辑

因为多了一个盘符$RECYCLE.BIN文件夹,据说是回收站文件夹,这个文件夹比较特殊,我对他取了3次子路径,直到报错,一般是隐藏,受保护的

y1.jpg (16.36 KB, 下载次数: 29)

y1.jpg

右.png (169.34 KB, 下载次数: 32)

右.png

作者: zaoan    时间: 2016-9-8 19:53
学习了,挺好
作者: kangnam    时间: 2016-9-8 21:58
对于windows盘符目录,必须在末尾加上路径分隔符,不然会路径解析出现问题.

作者: crossover    时间: 2016-9-9 17:37
遍历获取文件的代码;
public static void allFile(File file){
                File[] lf = file.listFiles();
                if(lf != null){
                        for (File file2 : lf) {
                                if(file2.isDirectory()){
                                        allFile(file2);
                                }else if(file2.getName().startsWith("java")){
                                        System.out.println(file2.getName);
                                }
                        }
                }
        }
作者: wosika    时间: 2016-9-9 22:15
报错是不是空指针异常?这是很正常的,因为在硬盘根目录下有一个隐藏的不可访问的系统目录,所以会出现异常,如果你对其他的子目录进行遍历就没错了
作者: 芳燚乐乐    时间: 2016-9-9 23:15
import java.io.File; import java.util.Scanner; /*  * .从键盘接收一个文件夹路径,统计该文件夹大小。  */ public class Test2 {         public static void main(String[] args) {                 Scanner sc=new Scanner(System.in);                 System.out.println("输入文件路劲");                 String str=sc.nextLine();                 File file73=new File(str);                 File[] abc=file73.listFiles(new Test1_1());                 int sum=0;                 for(File fg:abc){                    sum+=fg.length();                 }                 System.out.println(sum);         }  }接口类import java.io.File; import java.io.FileFilter;  /*  * 自定义过滤器  */ public class Test1_1 implements FileFilter {          @Override         public boolean accept(File pathname) {                                  return pathname.getName().endsWith(".");         }  }你看一下
作者: huangbinqqian    时间: 2016-9-10 23:56
public class Demo_18复制文件 {

        /**
         *  *Test41--编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt。
         */
        public static void main(String[] args) throws Exception{
                File file  = new File("C:\\Users\\John\\Desktop\\题库");
                getFile(file);

        }

        public static void getFile(File file) throws Exception{               
                File f1 = new File("C:\\Users\\John\\Desktop\\新建文件夹 (2)",file.getName());
                if (!f1.exists()) {
                        f1.mkdir();
                }
                File[] file1 = file.listFiles();
                for (File file2 : file1) {
                        if(file2.isFile()) {
                                        File ff = new File(f1,file2.getName());
                                        //File f = new File("C:\\Users\\John\\Desktop\\新建文件夹 (2)",file2.getName());
                                        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file2));
                                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(ff));
                                        int b;
                                        while((b = bis.read())!= -1) {
                                                bos.write(b);
                                        }
                                        bis.close();
                                        bos.close();
                               
                        } else {
                                getFile(file2);
                        }
                }
               
        }

}
这个代码,基本是可以,但是有一点点瑕疵,刚刚大家交流一下
作者: changfa    时间: 2016-9-11 08:40
package com.heima.ch;  import java.io.File; import java.util.Scanner;  public class Tset1 {          /**          * * 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小  主要是考递归循环判断  希望对你有用         */         public static void main(String[] args) {                                   File dir = getFile();                 System.out.println(printFile(dir));          }          public static long printFile(File dir) {                 File[] files = dir.listFiles();                 long len =0 ;                 for (File file : files) {                         if(file.isFile()){                                                                  len = len + file.length();                         }else{                                 printFile(file);                         }                                           }                 return len;         }          public static File getFile() {                 Scanner sc = new Scanner(System.in);                 while(true){                 System.out.println("111111");                 String line = sc.nextLine();                 File file = new File(line);                 if(!file.exists()){                                 System.out.println("不cz文件");                          }else if(file.isFile()){                                  System.out.println("是文件");                          }else{                                                    return file;                          }                 }         }  }
作者: 13411939415    时间: 2016-9-11 09:41
其实不止隐藏文件的问题,因为用的是递归,分分钟内存溢出
作者: Coder虫    时间: 2016-9-11 09:45
学习观摩..
作者: 胡小胡小胡    时间: 2016-9-26 11:08
判断隐藏文件的之前没用过,现在来学习下
作者: 某某帅    时间: 2016-9-29 21:58
因为 c盘的文件夹里可能有隐藏文件 它判断不了




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