java——IO讲解一(File)

IO:I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。 在POSIX兼容的系统上
java_IO:Java IO 是一套Java用来读写数据(输入和输出)的API。大部分程序都要处理一些输入,并由输入产生一些输出。Java为此提供了java.io包。
java_IO的原理图:


java——IO讲解一(File)_第1张图片
无标题.png

上面的java程序通过i/o传递给JVM,JVM传给WINDOWS,最后WINDOWS操作。
想要对这些数据进行持久化等操作,需要一些技术完成其它设备上的数据操作。就需要用到I/O技术,而我们使用的是java中提供的I/O技术。

数据保存在硬盘上最终的体现都是文件,所有我们最先了解I/O对文件的操作:File类。
File类只能对操作文件或目录本身,不能操作文件里面的内容,如果要操作文件中的内容,需要用到后面的内容,流的思想。
File的一些常见的方法:
·public File(String pathname):【创建文件对象,pathName是文件夹+[文件名]组成】

·public boolean createNewFile() throws IOException 【创建一个文件,不是文件夹】

·public boolean delete():【删除文件,删除的是当前文件对象的子文件对象】

·public boolean exists():【判断当前文件对象所对饮的目录在磁盘中是否存在】

·public String getName():【获取文件对象的名称】

·public String getParent():【获取文件所在的目录】

·public boolean isDirectory():【判断当前对象是否是一个文件夹】

·public boolean isFile():【判断当前对象是否是文件】

·public long length():【获取文件的大小,以字节为单外返回】

·public String[] list():【获取当前文件目录下的所有文件对象的名称(第一目录)】

·public File[] listFiles():【获取当前文件目录下所有文件对象(第一目录)】

·public boolean mkdir():【新建一个文件夹,该文件夹不能有子文件目录】

·public boolean mkdirs();【创建一个文件夹,可以包括子文件目录】

·public static final String separator【该属性可以根据不同的操作系统取得不同的文件分割符】

示例:

package com.zhaoqiang.file;

import java.io.File;
import java.io.IOException;

public class Demo1 {

    public static void main(String[] args) throws Exception {
        // 创建一个File对象
        File f = new File("d:\\Demo\\demo.txt");
        
        
        /* // File.separator是自动获取当前系统的分隔符
         * // 将demo文件封装成对象
         * 注意:如果d盘中不存在Demo目录。File也可以封装不存在的文件对象
         * */
        File f2 = new File("d:"+File.separator+"Demo"+File.separator+"demo.txt"); 
        
        
        // 父目录和子目录分开写。在子目录不确定的情况下可以这样写
        File f3 = new File("\"d:"+File.separator+"Demo\"","demo.txt");
        
        /*
         * exists:判断当前文件对象是否在磁盘中存在
         * getParentFile()获取父目录对象。
         * mkdirs():创建文件夹
         * */
        
        if (!f2.getParentFile().exists()) {
            f2.getParentFile().mkdirs();
            f2.createNewFile();
        }
        
        // 获取文件所在目录
        System.out.println(f2.getParent());
        
        // 判断当前对象是否是一个文件夹
        System.out.println(f2.getParentFile().isDirectory());
        
        // 判断当前对象是否是一个文件
        System.out.println(f2.isFile());
        
        // 获取文件的大小,大小以字节返回
        System.out.println(f2.length());
        
        // 获取当前文件目录下的所有文件对象名称(第一目录(同级目录))
        String[] list = f2.list();
        
        // 获取当前文件目录下的所有文件对象
        File[] file = f2.listFiles();
        // 删除文件
        f2.delete();
        
        // 删除文件夹中所有文件
        f2.getParentFile().delete();
    }

}

过滤器:public File[] listFiles(FilenameFilter filter)

package com.zhaoqiang.file;

import java.io.File;

public class Demo3 {

    public static void main(String[] args) {
        /*
         *  过滤器:
         *  
         *  需求:获取目录中的内容,但是只要.java文件
         * */
        
        File dir = new File("D:"+File.separator+"Demo");
        File[] file = dir.listFiles();
        for(File f:file){
//          if (f.getName().endsWith(".java")) {
//              System.out.println(f.getName());
//          }
            getFile(f,".java");
        }
        
    }
    
    
    // 自定义一个简单的过滤器
    public static void getFile(File file,String str){
        if (file.getName().endsWith(str)) {
            System.out.println(file.getName());
        }
    }

}

通过实现FilenameFilter接口,创建一个比较器对象

package com.zhaoqiang.file;

import java.io.File;
import java.io.FilenameFilter;

class Filename implements FilenameFilter{

    private String str;
    public Filename(String str) {
        this.str = str;
    }
    @Override
    public boolean accept(File dir, String name) {
//      if (dir.getName().endsWith(name)) 
//          return true;
//      else
//          return false;
        return name.endsWith(str);
    }
    
}


public class Demo3 {

    public static void main(String[] args) {
        /*
         *  过滤器:
         *  
         *  需求:获取目录中的内容,但是只要.java文件
         * */
        
        File dir = new File("D:"+File.separator+"Demo");
        
//      File dic = new File(dir,"demo.txt");
//      File[] file = dir.listFiles();
        File[] file = dir.listFiles(new Filename(".java"));
        
        
         /*
                public File[] listFiles(FilenameFilter filter) {
                String ss[] = list();   调用了File中list方法,获取所有的名称数组
                if (ss == null) return null;    // 判断目录中是否有文件
                ArrayList files = new ArrayList<>();  // 创建一个集合,用于存放文件对象
                for (String s : ss)                     // 遍历数组里面文件对象名称
                    if ((filter == null) || filter.accept(this, s))  //对遍历的名称进行过滤器的判断,将当期目录this,遍历到的名称传递给了过滤器
                        files.add(new File(s, this));           // 把满足条件的文件添加进集合中
                return files.toArray(new File[files.size()]);           // 将集合转化成数组返回
            }   
          */        
        
        
        for(File f:file){
//          if (f.getName().endsWith(".java")) {
                System.out.println(f.getName());
//          }
//          getFile(f,".java");
            
        }
        
    }
    
    
    // 自定义一个简单的过滤器
    public static void getFile(File file,String str){
        if (file.getName().endsWith(str)) {
            System.out.println(file.getName());
        }
    }

}


示例:获取d盘下所有目录

package com.zhaoqiang.file;

import java.io.File;

public class Demo2 {

    public static void main(String[] args) {
        File f = new File("D:"+File.separator);
        
        File[] file = f.listFiles();
        
        for(File f1:file){
            System.out.println(f1);
        }

    }

}

上面的方法只能获得d盘下的一级目录,并不能获取到D盘下所有的目录,所以我们需要用到递归:

package com.zhaoqiang.file;

import java.io.File;

public class Demo2 {

    public static void main(String[] args) {
        File f = new File("D:"+File.separator);
        
        printDirs(0,f);
    }
    
    public static void printDirs(int level,File f){
        for (int i = 0; i < level; i++) {
            System.out.print("  ");
        }
        
        // 获取文件名
        System.out.println(f.getName());
        
        if (f.isDirectory()) { // 如果文件是文件夹
            File fs[] = f.listFiles();
            for(File f1:fs){
                // 递归调用
                printDirs(level+1,f1);
            }
        }
            
    }
}
    

你可能感兴趣的:(java——IO讲解一(File))