EchoDemo's Blogs

Java中IO框架之File

1、I/O框架介绍

I/O(Input/Output)是计算机输入/输出的接口。Java的核心库java.io提供了全方面的I/O接口,包括:文件系统的操作,文件读写,标准设备输出等等。

2、File类及使用

(1)一个File类的对象,表示了磁盘上的文件或者目录。File类提供了与平台无关的方法来对磁盘上的文件或者目录进行操作。File类直接处理文件和文件系统。比如删除文件,获取文件长度大小等信息。File类没有提供方法从文件读取或者向文件存储信息。其构造方法有:File(String directoryPath);File(String directoryPath,String filename);File(File dirObj,String filename);

(2)File定义了获取File对象标准属性的方法:

public String getName();获取文件或目录的名字

public String getParent();获取父目录的路径字符串

public File getParentFile();获取父目录的File对象

public String getAbsolutePath();获取文件或目录的绝对路径

public boolean exists();判断文件或目录是否存在

public String[] list();获得目录里面的文件名和目录名。

public boolean isDirectory();判断是否是目录

public boolean isFile();判断是否是文件

public long length();获取文件的大小

public boolean delete();删除目录或者文件夹

public boolean mkdir();创建文件夹

......

3、IO方法举例

package com.iotek.file;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;

public class FileDemo {

    public static void main(String[] args) {
        File file = new File("f:\\hehe");
        System.out.println(file.getAbsolutePath());//获得绝对路径
        System.out.println(file.getParent());//获得父目录的路径字符串
        System.out.println(file.isDirectory());//判断是否为目录
        System.out.println(file.isFile());//判断是否为文件
        System.out.println(file.exists());//判断是否存在
        System.out.println(file.length());//获取长度

        File myFile = new File("f:\\hehe");
        System.out.println(myFile.mkdir());//新建一个目录

        File myFile1 = new File("f:/hehe/hehe.txt");
        try {
            System.out.println(myFile1.createNewFile());//新建一个文件
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*String[] filesStrings = file.list();//获取当前目录下的所有文件名和目录名
        for(String f:filesStrings){
            System.out.println(f);
        }*/

        /*String[] filesString = myFile.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".gif");//查找gif后缀的文件,打印文件名
            }
        });
        for(String f:filesString){
            System.out.println(f);
        }*/    

        /*File[] files = myFile.listFiles();
        for(File f:files){
            System.out.println(f.getName() + "--" + f.length());//打印文件或目录的名字和大小
        }*/

        /*File[] filesString = myFile.listFiles(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".gif");//查找gif后缀的文件,打印文件名
            }
        });
        for(File f:filesString){
            System.out.println(f.getName() + "--" + f.length());
        }*/

        File[] files = myFile.listFiles(new FileFilter() {

            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".gif");
            }
        });
        for(File f:files){
            System.out.println(f.getName() + "--" + f.length());
        }
    }
}

4、案例

(1)案例说明:给定一个目录要求按层次显示目录结构信息,文件名后面加上*或者\来表示文件夹。

(2)案例分析:使用递归算法,使用File类中的ListFile方法来遍历文件夹,使用List集合。

(3)案例实现

package com.iotek.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class IteratorDirDemo {

    public static void main(String[] args) {
        IteratorUtil.IteratorDir(new File("f:/git"));
    }
}

class IteratorUtil{
    private static int level = 0;
    public static void IteratorDir(File file){
        if(null!=file){
            /*
             * 找到递归的出口,如果是文件或者是空文件夹就触碰到边界
             */
            if(file.isFile()||file.listFiles().length==0){
                return;
            }else{
                File[] files = file.listFiles(); 
                files = sortFiles(files);
                for(File f:files){
                    StringBuilder sBuilder = new StringBuilder();
                    sBuilder.append(getTab(level));
                    sBuilder.append(f.getName());
                    if(!f.isFile()){
                        sBuilder.append("\\");
                    }
                    System.out.println(sBuilder.toString());
                    if(f.isDirectory()){//如果是文件夹,进入目录遍历,层级自增1
                        level++;
                        IteratorDir(f);
                        level--;//目录自减1,返回上一级目录
                    }
                }
            }
        }
    }

    private static File[] sortFiles(File[] files) {//对File类型的数组进行先目录后文件的排列
        List<File> fList = new ArrayList<File>();
        for(File f:files){//先存放文件夹
            if(f.isDirectory()){
                fList.add(f);
            }
        }
        for(File f:files){//再存放文件
            if(f.isFile()){
                fList.add(f);
            }
        }
        return fList.toArray(new File[fList.size()]);//把集合中的元素转化成指定大小的和指定类型的数组
    }

    private static String getTab(int level) {//根据层级数来得到制表符的个数
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=0;i<level;i++){
            stringBuilder.append("\t");
        }
        return stringBuilder.toString();
    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------