写在前面

java学习笔记 七——IO

笔记

流是一个抽象、动态的概念,是一连串连续动态的数据集合

mark

I/O流的几个核心类或接口:(5个类3个接口)

说明
File 文件流
InputStream 字节输入流
OutputStream 字节输出流
Reader 字符输入流
Writer 字符输出流
Closeable 关闭流接口
Flushable 刷新流接口
Serializable 序列化接口

按照流向分类:

  • 输入流:数据源到程序(InputStream、Reader)
  • 输出流:程序到目的地(OutputStream、Writer)

按照功能分:

  • 节点流:可以直接从数据源或目的地读写数据

  • 处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装

    节点流与处理流:

    1. IO流所有操作都是通过节点流进行的
    2. 处理流可以对其他流进行处理

按照数据分:

  • 字节流:按照字节读取数据的(InputStream、OutputStream)
  • 字符流:按照字符读取数据(Reader、Writer)。其底层还是基于字节流操作,自动搜寻指定码表

File

相对路径是相对于工程文件夹。

File常用方法:

基本信息(文件和路径):
package cn.xgblack.io;

import java.io.File;

/**
 * 名称和路径
 */
public class FileDemo03 {
    public static void main(String[] args) {
        File src = new File("IO.png");

        System.out.println("名称:" + src.getName());
        System.out.println("路径:" + src.getPath());
        System.out.println("绝对路径:" + src.getAbsolutePath());

        System.out.println("父路径:" + src.getParent());//根据定义的是相对路径还是绝对路径结果不同,如果父路径没有则返回null
        //System.out.println("父对象:" + src.getParentFile().getName());//此处父对象为空,所以运行的话会报空指针异常
    }
}

mark

文件状态:
package cn.xgblack.io;

import java.io.File;

/**
 * 文件状态
 * 1、不存在exists
 * 2、存在
 *      文件:isFile
 *      文件夹:isDirectory
 */
public class FileDemo04 {
    public static void main(String[] args) {
        File src = new File("IO.png");
        System.out.println("是否存在:" + src.exists());
        System.out.println("是否为文件:" + src.isFile());
        System.out.println("是否为文件夹:" + src.isDirectory());

        src = new File("123/IO.png");
        System.out.println("----------------------------");
        System.out.println("是否存在:" + src.exists());
        System.out.println("是否为文件:" + src.isFile());
        System.out.println("是否为文件夹:" + src.isDirectory());

        //常用文件操作
        src = new File("xxx");
        if (!src.exists() || src == null){
            System.out.println("文件不存在");
        }else{
            if (src.isFile()){
                System.out.println("文件操作");
            }else {
                System.out.println("文件夹操作");
            }
        }


    }
}

其他信息:
  • length()获取文件长度(long类型),如果不存在或者是文件夹则返回0

  • createFile()创建文件(不能创建文件夹)前提是文件不存在才能创建 (创建文件时,与系统关键词冲突也无法创建)

  • delete()删除已经存在的文件

    File src = new File("D:/Code/IdeaJava/javaStudyIO/IO.txt");
          boolean flag = src.createNewFile();
          System.out.println(flag);
          flag = src.delete();
          System.out.println(flag);
    

文件夹:

  • mkdir()确保上级目录存在,不存在创建失败

  • mkdirs()上级目录可以不存在,不存在统一来创建

    File dir = new File("D:/Code/IdeaJava/javaStudyIO/src/dir/test");
    
          boolean flag = dir.mkdir();
          System.out.println(flag);
          flag = dir.mkdirs();
          System.out.println(flag);
    
  • list()列出下一级名称(返回String数组)

  • listFiles()列出下一级File对象(返回File对象数组)

    //列出下级名称
          String[] subName = dir.list();
          for(String s:subName){
              System.out.println(s);
          }
    
          System.out.println("###################");
    
          //下级对象
          File[] subFiles = dir.listFiles();
          for (File s:subFiles
               ) {
              System.out.println(s.getAbsolutePath());
          }
    

递归打印子孙级目录:

package cn.xgblack.io;

import java.io.File;

/**
 *递归
 * 打印子孙级目录
 */
public class DirDemo03 {
    public static void main(String[] args) {
        File dir = new File("D:/Code/IdeaJava/javaStudyIO");
        printName(dir,0);

    }

    public static void printName(File src,int deep){
        //控制层次感
        for(int i = 0;i < deep;i++){
            System.out.print("-");
        }
        //打印名称
        System.out.println(src.getName());
        if(src ==null||!src.exists()){//递归头
            return;
        }else if(src.isDirectory()){
            for(File s:src.listFiles()){
                printName(s,deep + 1);
            }
        }
    }


}

mark

递归统计文件夹的大小:

package cn.xgblack.io;

import java.io.File;

/**
 *统计文件夹的大小
 */
public class DirDemo04 {
    public static void main(String[] args) {
        File dir = new File("D:/Code/IdeaJava/javaStudyIO");
        count(dir);
        System.out.println(len);

    }
    private static long len = 0;

    public static void count(File src){

        //获取大小
        if (src != null&&src.exists()){
            if(src.isFile()){
                len += src.length();
            }else{
                for(File s:src.listFiles()){
                    count(s);
                }
            }
        }
    }


}

使用面相对象统计文件夹的大小
package cn.xgblack.io;

import java.io.File;

/**
 * 使用面向对象统计文件夹的大小
 */
public class DirCount {
    private long len;//大小
    private String path;//文件夹
    private File src;//源

    private int fileSize = -1;//文件的个数(不包含自身)
    private int dirSize = 1;//文件夹的个数(不包含自身)

    public DirCount(String path) {
        this.path = path;
        this.src = new File(path);

        count(this.src);
    }

    private void count(File src){

        //获取大小
        if (src != null&&src.exists()){
            if(src.isFile()){
                len += src.length();
                this.fileSize++;
            }else{
                this.dirSize++;
                for(File s:src.listFiles()){
                    count(s);
                }
            }
        }
    }

    public long getLen() {
        return len;
    }

    public int getFileSize() {
        return fileSize;
    }
    public int getDirSize() {
        return dirSize;
    }

    public static void main(String[] args) {
        DirCount dir = new DirCount("D:/Code/IdeaJava/javaStudyIO");
        System.out.println(dir.getLen() + "-->" + dir.getFileSize() + "-->" + dir.getDirSize());

        DirCount dir2 = new DirCount("D:/Code/IdeaJava/javaStudyIO/src");
        System.out.println(dir2.getLen() + "-->" + dir2.getFileSize() + "-->" + dir2.getDirSize());

    }


}

过滤器
  • FileFilter对File对象进行过滤
  • FileFilter

过滤器只有接口,没有实现类,实现类需要自己写,并重写accept方法,定义过滤规则。

import java.io.FileFilter;

/**
 * @author 小光
 * @date 2019/4/29 16:51
 * className: FileFilterImpl
 * description:
 * ***************************************************************************
 * Copyright(C),2018-2019,https://blog.xgblack.cn  .All rights reserved.
 * ***************************************************************************
 */
public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if (pathname.isDirectory()){
            return true;
        }else {
            return pathname.getName().toLowerCase().endsWith(".java");
        }
    }
}
public class RecursiveSearchFile {
    public static void main(String[] args) {
        File src = new File("./");
        printDir(src,0);
    }

    public static void printDir(File dir,int deep){

        for (int i = 0; i < deep; i++) {
            System.out.print("-");
        }
        //使用FileFilter过滤器过滤
        File[] files = dir.listFiles(new FileFilterImpl());
        if (dir.isDirectory()){
            for (File f:files){
                //if (f.getName().toLowerCase().endsWith(".java")){
                    System.out.println(f.getName());
                //}
                printDir(f,deep + 1);
            }

        }
    }
}

直接使用匿名内部类:

package cn.xgblack.io;

import java.io.File;
import java.io.FileFilter;

/**
 * @author 小光
 * @date 2019/4/29 13:29
 * className: RecursiveSearchFile02
 * description: 递归搜索文件
 * ***************************************************************************
 * Copyright(C),2018-2019,https://blog.xgblack.cn  .All rights reserved.
 * ***************************************************************************
 */
public class RecursiveSearchFile02 {
    public static void main(String[] args) {
        File src = new File("./");
        printDir(src,0);
    }

    public static void printDir(File dir,int deep){
        for (int i = 0; i < deep; i++) {
            System.out.print("-");
        }
        //传递过滤器对象,使用匿名内部类
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
            }
        });
        for (File f:files){
            if (f.isDirectory()){
                printDir(f,deep + 1);
            }else {
                System.out.println(f.getName());
            }
        }



    }
}

编码解码

字节-->字符:解码;字符–>字节:编码。

getBytes()方法,获取字符串的字节(返回byte[])

操作步骤

文件字节输入流:
  1. 创建源
  2. 选择流
  3. 操作
  4. 释放资源
/**
 * Copyright(C),2018-2019,http://blog.xgblack.cn
 * FileName:    IOTest01
 * Author:      小光
 * Date:        2019/4/24 17:52
 * Description: 标准步骤
 */
package cn.xgblack.iostudy;

import java.io.*;

public class IOTest02 {
    public static void main(String[] args) {
        //1.创建源
        File src = new File("abc.txt");
        //2.选择流
        InputStream is = null;
        try {
            is = new FileInputStream(src);
            //3.操作(读取)
            int temp;
            //当没有读取到时返回-1
            while ((temp = is.read()) != -1){
                System.out.print((char)temp);
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //4.释放资源
            //is用到了,才进行释放
            if (null != is){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
/**
 * Copyright(C),2018-2019, 小光 http://blog.xgblack.cn
 * FileName:    IOTest01
 * Author:      xg
 * Date:        2019/4/24 17:52
 * Description: 标准步骤:分段读取
 */
package cn.xgblack.iostudy;

import java.io.*;

public class IOTest03 {
    public static void main(String[] args) {
        //1.创建源
        File src = new File("abc.txt");
        //2.选择流
        InputStream is = null;
        try {
            is = new FileInputStream(src);
            //3.操作(分段读取)
            byte[] flush = new byte[1024];//缓冲容器
            int len = -1;
            //当没有读取到时返回-1
            while ((len = is.read(flush)) != -1){
             //字节数组-->字符串(解码)
                String str = new String(flush, 0, len);
                System.out.print(str);
            }


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