javaSE基础知识之File学习

通过对File的学习,掌握如下几个基础知识点:

1.学习File的常用方法

2.获取当前项目的路径

3.如何在项目下创建指定文件夹和指定文件

4.复制指定文件夹下的所有文件

5.实现对电脑所有磁盘的文件扫描

6.删除磁盘指定文件夹的所有文件

7.简单学习爬取指定网站的链接网址

一、File的常用方法,应该包括其构造方法和常用普通方法,如下代码:

private void studyFileMethods(){

        // 1.通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例(文件目录在src目录下)
        File file=new File("F:\\studyNote\\2021\\ClassStudy\\MyNumber\\src\\demoFiles\\studyFiles.txt");

        // 2.判断该文件在当前程序的该路径下能否执行
        boolean canExecute = file.canExecute();
        // 2.1.设置该抽象路径名的所有者的执行权限
        file.setExecutable(true);
        // 2.2.设置该抽象路径名的所有者或每个人的执行权限
        file.setExecutable(true,true);
        // 3.判断该路径下的文件是否存在,存在则读取,不存在则创建
            if (!file.exists()) {

                // 4.文件不存在,创建文件(必须是在绝对路径下方可创造)
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            } else {

                // 4.在该抽象路径下是否可读
                boolean canRead = file.canRead();
                // 4.1.设置该抽象路径名的所有者的读取权限
                file.setReadable(true);
                // 4.2.设置该抽象路径名的所有者或每个人的读取权限
                file.setReadable(true,true);
                // 4.3.设置该抽象路径名的文件或目录只读
                file.setReadOnly();

                // 5.在该抽象路径下是否可写
                boolean canWrite = file.canWrite();
                // 4.1.设置该抽象路径名的所有者的写入权限
                file.setWritable(true);
                // 4.2.设置该抽象路径名的所有者或每个人的写入权限
                file.setWritable(true,true);

                // 6.比较两个抽象的路径名字典
                File file1=new File("demoFiles\\studyFiles1.txt");
                int compareValue = file.compareTo(file1);

                // 7.删除该文件
                // boolean delete = file.delete();
                // 8.请求在虚拟机终止时删除由此抽象路径名表示的文件或目录
                //file.deleteOnExit();

                // 9.获取文件名称
                String fileName = file.getName();
                // 10.文件重命名(可以指定位置和名称,类似于另存为)
                boolean renameTo = file.renameTo(new File("test1.txt"));

                // 11.获取文件的绝对路径
                String absolutePath = file.getAbsolutePath();
                // 11.1.获取文件的路径(结果同上)
                String path = file.getPath();
                // 12.返回此抽象路径名的路径名字符串
                Path toPath = file.toPath();
                // 13.返回此抽象路径名的绝对形式,同11/12字符串结果一样
                File absoluteFile = file.getAbsoluteFile();

                try {
                    // 14.返回此抽象路径名的规范形式
                    File canonicalFile = file.getCanonicalFile();
                    // 15.返回此抽象路径名的规范路径名字符串。(11/12/13/14/15字符串结果均一样,得到绝对路径名)
                    String canonicalPath = file.getCanonicalPath();

                } catch (IOException e) {
                    e.printStackTrace();
                }

                // 16.构造一个表示此抽象路径名的 file: URI
                URI uri = file.toURI();

                // 17.获取文件的长度
                long length = file.length();
                // 18?.返回分区未分配的字节数 named此抽象路径名
                long freeSpace = file.getFreeSpace();
                // 19?.通过此抽象路径名返回分区 named的大小
                long totalSpace = file.getTotalSpace();
                // 20?.返回上的分区提供给该虚拟机的字节数 named此抽象路径名
                long usableSpace = file.getUsableSpace();

                // 21.测试这个抽象路径名是否是绝对的
                boolean absolute = file.isAbsolute();
                // 22.测试此抽象路径名表示的文件是否为目录
                boolean directory = file.isDirectory();
                // 23.测试此抽象路径名表示的文件是否为普通文件
                boolean isFile = file.isFile();
                // 24.测试此抽象路径名命名的文件是否为隐藏文件
                boolean hidden = file.isHidden();

                // 25.返回此抽象路径名表示的文件上次修改的时间
                long lastModified = file.lastModified();
                // 26.设置由此抽象路径名命名的文件或目录的最后修改时间
                boolean setLastModified = file.setLastModified(9999999999999L);


                // 27.获取上一级路径,即去掉文件名的路径,如果没有则为null
                String parent = file.getParent();
                // 28.获取上一级的文件,与27获取的字符串结果一样,但是实际结果完全不同,一个是字符串,一个是文件
                File parentFile = file.getParentFile();

                // 29.返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录,该例中已是文件,所以均为0
                String[] list = file.list();
                // 30.返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件,该例中已是文件,所以均为0
                File[] files = file.listFiles();


                // 31.返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录
                String[] list1 = file.list(new FilenameFilter() {
                    @Override
                    public boolean accept(File dir, String name) {
                        // 如果是指定的文件,就添加到文件数组中,如果不是,就不添加。dir当前文件的目录,name当前目录下各个文件的名称
                        if("test.txt".equals(name))
                            return true;
                        else
                            return false;

                    }
                });

                // 32.返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录
                File[] files1 = file.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        String pathnameName = pathname.getName();
                        String substring = pathnameName.substring(pathnameName.lastIndexOf("."));
                        // 若是以“.txt”结尾则返回true,否则false,作用是过滤掉所有非“.txt”文件
                        if(".txt".equals(substring))
                            return true;
                        else
                            return false;
                    }
                });

                // 33.返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录
                File[] files2 = file.listFiles(new FilenameFilter() {
                    @Override
                    public boolean accept(File dir, String name) {
                        // 如果是指定的文件,就添加到文件数组中,如果不是,就不添加。dir当前文件的目录,name当前目录下各个文件的名称
                        if("test.txt".equals(name))
                            return true;
                        else
                             return false;

                    }
                });


            }

    }

二、获取当前目录的路径有如下的方法:

        // 1.获取当前类的路径方法1
        URL resource1 = FileDemo.class.getResource("/");
        // 2.获取当前类的路径方法2
        URL resource2 = FileDemo.class.getResource("");
        // 3.获取当前类的路径方法3
        URL resource3 = Thread.currentThread().getContextClassLoader().getResource("");
        // 4.获取当前类的路径方法4
        URL resource4 = FileDemo.class.getClassLoader().getResource("");
        // 5.获取当前类的路径方法5
        URL systemResource = ClassLoader.getSystemResource("");
        // 6.获取当前类的路径方法6
        String absolutePath = new File("").getAbsolutePath();

        //测试结果输出
        System.out.println("方法1:"+resource1.getPath());
        System.out.println("方法2:"+resource2.getPath());
        System.out.println("方法3:"+resource3.getPath());
        System.out.println("方法4:"+resource4.getPath());
        System.out.println("方法5:"+systemResource.getPath());
        System.out.println("方法6:"+absolutePath);
========================================================================================结果如下:==================================================================================
方法1:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法2:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/com/study/file/
方法3:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法4:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法5:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法6:F:\studyNote\2021\ClassStudy\MyNumber

三、在项目下创建一个files文件夹和该文件夹下的data.txt文件(需要先创建文件再创建文件夹)

        // 创建文件夹
        File file = new File("files");
        if(!file.exists()){
            file.mkdirs();// files成为目录文件
        }
        // 创建文件
        File dataFile = new File("files/data.txt");
        if(!dataFile.exists()){
            try {
                dataFile.createNewFile();// 创建文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

四、复制指定文件夹下的所有文件到指定目录下:(将该项目的所有文件复制到D盘下)

解决思路:

(1)首先需要获取将要读取项目的路径

(2)读取项目路径下的文件夹和文件,是文件就复制文件,是文件夹下就进行判断D盘是否存在该文件夹,不存在则进行创建,然后继续读取

(3)使用递归的方式读取,直至读完所有的文件

    // 调用方法
         File srcFile=new File("F:\\studyNote\\2021\\ClassStudy\\MyNumber");
         File destFile=new File("D:\\");
         this.studyFileCopyDirectory(srcFile,destFile);

    /**
     * 遍历文件
     *
     * @param srcFile 源文件
     * @param destFile 目标文件
     */
    private void studyFileCopyDirectory(File srcFile,File destFile){


  // 判断是否是文件
       if(srcFile.isFile()){// 是文件
           // 获取保存文件的路径
           String path=(destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath() : destFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3);
           // 读文件
           try (
                   FileInputStream fis = new FileInputStream(srcFile);
                   FileOutputStream fos=new FileOutputStream(path)
           ) {
               byte[] bytes=new byte[1024];
               int aa=fis.read(bytes);
               while (aa != -1){
                   fos.write(bytes,0,aa);
                   aa=fis.read(bytes);
               }
               fos.flush();
           } catch (FileNotFoundException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }


           return;
       }
       
       // 获取文件夹下的所有文件
        File[] files = srcFile.listFiles();
        for (File file : files) {
            if(file.isDirectory()){
                // 获取创建目录文件的路径
                String destPath=(destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath() : destFile.getAbsolutePath()+"\\")+file.getAbsolutePath().substring(3);
                // 创建新文件
                File newFile=new File(destPath);
                // 目录不存在则创建目录
                if(!newFile.exists()){
                    newFile.mkdirs();
                }
            }
            // 递归判断执行
            studyFileCopyDirectory(file,destFile);
        }
    }

五、实现对电脑磁盘所有文件的扫描:

 private void scannerAllFile() {

        // 获取所有的根目录
        File[] files = File.listRoots();
        // 遍历根目录
        for (File file : files) {
            long start = System.currentTimeMillis();
            System.out.println("=======================================================================" + file.getAbsolutePath() + "盘所有末端文件夹或文件名称=========================================================");
            // 获取目录文件下的所有文件
            File[] files1 = file.listFiles();
            // 结果判断:null值说明是文件,否则是文件夹
            if (files1 != null) {
                // 文件夹长度为0说明该文件夹中是没有任何文件的,否则至少存在一个文件
                if (files1.length == 0) {
                    System.out.println("文件夹的名称:" + file.getName());
                } else {
                    // 将所获文件添加到未读文件集合中
                    for (File file1 : files1) {
                        if (unReadFiles.contains(file1) == false) {
                            unReadFiles.add(file1);
                        }
                    }
                }
            } else {
                System.out.println("文件名称:" + file.getName());
            }
            // 对磁盘中所有文件进行读取
            printFileName();
            long end = System.currentTimeMillis();
            times.add((end - start) / (1000 * 60));

        }


    }

    private void printFileName() {
        
        // 执行条件:集合不为空且具有元素的情况下执行
        if (unReadFiles != null) {

            // 依次读取文件
            for (int i = 0; i < unReadFiles.size(); i++) {
                File unReadFile = unReadFiles.get(i);

                if (unReadFile != null) {
                    File[] listFiles = unReadFile.listFiles();
                    // 判断文件是否为空:空值说明是文件,否则是文件夹
                    if (listFiles != null) {
                        // 文件夹长度为0,说明没有子文件
                        if (listFiles.length == 0) {
                            System.out.println("文件夹名字:" + unReadFile.getName());

                        } else {
                            // 集合大于1,说明有文件,把未读取文件添加到集合中
                            for (File listFile : listFiles) {
                                if (unReadFiles.contains(listFile) == false) 
                                    unReadFiles.add(listFile);
                                
                            }
                        }
                    } else {
                        System.out.println("文件名称:" + unReadFile.getName());
                    }
                }
                // 删除已经执行的文件
                unReadFiles.remove(unReadFile);

            }
            printFileName();
        }
    }

六.删除磁盘指定文件夹的指定类型文件:给定磁盘和指定文件夹删除方法很简单,如下

    
        // 指定删除文件夹下的指定类型文件(如果只有文件夹的名字,则需要遍历磁盘查询获取)
        String fileName = "E:\\测试文件";
        this.deleteFiles(fileName);

    private void deleteFiles(String fileName){

        // 获取该路径下的文件
        File file = new File(fileName);
        // 获取其目录下的所有文件并进行遍历
        File[] files = file.listFiles();
        if (files != null) {
            for (File fe : files) {
                if(fe.isFile()){
                    // 删除所有txt文件
                    if(fe.getName().endsWith(".txt")){
                        fe.delete();// 删除文件
                    }
                }else{
                    deleteFiles(fe.getAbsolutePath());
                }
            }
        }
    }

七.简单学习爬取指定网站的链接网址(很多网站是不允许爬取的,这里以自学网为例)

    /**
     * 通过指定网站爬取6个网站的所有https的地址
     */
    private void crawlerMyPage(){
        System.out.println("Enter a URL: ");
        // 爬取我要自学网网站:https://www.51zxw.net/
        String bgURL=input.next();

        // 记录没有爬过的网址
        ArrayList<String> listOfPendingURLs=new ArrayList<>();
        // 记录已经爬过的网址
        ArrayList<String> listOfTraverURLs=new ArrayList<>();

        // 没爬过的网址添加到记录中
        listOfPendingURLs.add(bgURL);
        // 只爬取六个网址
        while(!listOfPendingURLs.isEmpty()&&listOfTraverURLs.size()<=5) {
            // 爬过之后移除
            String ul=listOfPendingURLs.remove(0);
            // 如果是新的网址,才进行爬取
            if(!listOfTraverURLs.contains(ul)) {
                // 把爬过的网址添加到保存记录中
                listOfTraverURLs.add(ul);
                // 遍历获取到的所有网址,如果没有爬取过,则将爬取到的网址添加到记录没有爬过的集合中
                for(String s: getSubURLs(ul)) {
                    if(!listOfTraverURLs.contains(s)) {
                        listOfPendingURLs.add(s);
                    }
                }

            }
        }

        System.out.println("==========================================遍历集合listOfPendingURLs============================================================");
        if (listOfPendingURLs != null) {
            for (String listOfPendingURL : listOfPendingURLs) {
                System.out.println(listOfPendingURL);
            }
        }

        System.out.println("==========================================遍历集合listOfTraverURLs============================================================");
        if (listOfTraverURLs != null) {
            for (String listOfTraverURL : listOfTraverURLs) {
                System.out.println(listOfTraverURL);
            }
        }

    }

    /**
     * 获取爬过的网址的集合
     * @param ul 进行爬取的网址
     * @return 返回一个String类型的集合,记录爬到的网址
     */
    public  ArrayList<String> getSubURLs(String ul){
        ArrayList<String> list=new ArrayList<>();
        try {
            // 获取具体要爬的网站
            URL rl = new URL(ul);
            // 读取流文件
            Scanner in=new Scanner(rl.openStream());
            // 记录查找到的开始位置
            int count=0;
            while(in.hasNext()) {
                // 按行读
                String line=in.nextLine();
                
                // 获取以http或https:开头的位置
                count=line.indexOf("http:",count);
                while(count>0) {
                    
                    // 获取以"结尾的位置
                    int endIndex=line.indexOf("\"",count);
                    if(endIndex>0){// 正值表示符合要求
                        
                        list.add(line.substring(count,endIndex));
                        count=line.indexOf("http:",endIndex);
                        
                    }else {// 没找到就是没有符合的网址
                        count=-1;
                    }
                }
            }

        } catch (Exception e) {
            System.out.println("程序出错");
            e.printStackTrace();
        }

        return list;
    }

猜你喜欢

转载自blog.csdn.net/preston555/article/details/112886509