IO流-流的基本概述(流的划分/字符和字节的区别/File文件类/Charset文件类)

目录:

流的基本概述
流的划分
数据的读取流程
字节和字符的区别
几种常用字符码表
java提供的编码类:Charset
File类详解
得到给定路径下所有包含filter关键字的文件

流的基本概述:

  • 什么是流: 流的本质是数据传输,数据有序集合,能从一个端传输到另一端的过程流;
  • java对数据的操作是通过流的方式,java用于流操作的对象都在IO包中;

流的划分:

IO流-流的基本概述(流的划分/字符和字节的区别/File文件类/Charset文件类)

按照方向划分: 输入流,输出流;
  • 输入流:将数据从介质(磁盘,网络)到当前程序的传输称为输入流;
  • 输出流:将数据从程序写入到存储介质中称为输出流;
  • 输入流是以InputStream和Reader作为基类;
  • 输出流是以OutputStream和Writer作为基类;
按照操作单元: 分为字节流和字符流;
  • 字节流:二进制表示的数据,一个字节8bit位;
  • 字符流:将数据以字符形式表示; ads234等等;
  • 字节流是以 InputStream和OutputStream作为基类;
  • 字符流是以Reader和Writer作为基类;
类型 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
按照角色划分:节点流,处理流;
  • 节点流(介质流):数据从(向)一个介质(磁盘,鼠标,屏幕)读(写)的流称为节点流,也称为低级流;
  • 处理流(高级流):和节点流直接相连的流;
  • 节点流和处理流的区别:
  • 节点流直接和介质相连接;
  • 处理流和节点流相连接;

数据的读取流程:IO流-流的基本概述(流的划分/字符和字节的区别/File文件类/Charset文件类)

字节和字符的区别:字节存储的数据为二进制;字符存储的数据为字符;

  • 读写单元不同:

  • 字节流是以字节为单位(8bit);

  • 字符流以字符为单位,根据码表映射字符,一次可以读取多个字节;

  • 处理对象不同:

  • 字节流能处理所有类型的数据(图片,avi等);

  • 字符流只能处理字符类型的数据;

  • 处理效率:

  • 字节流处理效率较高,直接进行读取;

  • 字符流效率较低,涉及到编码解码过程;

  • 可移植性:

  • 字节流可一直性高,和平台无关;

  • 字符流需要考虑编码解码过程,编码解码表需要保持一致;

几种常用字符码表:

码表是将字符和数字建立起映射关系,实现字节和字符的相互转换;

  • 解码:字节-》字符;
  • 编码:字符-》字节;
  1. ASCII码:一个字符用(一个字节的低)7位表示,对应字节都是整数,总共可以表示127个字符;
  2. ISO-8899-1: 拉丁码表:用一个字节的8位表示,可以表示整数和负数;
  3. GBK(国标,中文码表): 用两个字节表示,2个字节的第一个字节最高位为1,第二个字节最高位为0;
  4. Unicode: 国际标准码表,无论什么文字都是两个字节表示;
  5. UTF-8:基于Unicode,一个字节表示存储信息,每一个字节头加入了编码信息;

java提供的编码类:Charset

   //当前默认的编码
Charset charset = Charset.defaultCharset();
//当前系统支持的所有字符集编码
SortedMap <String, Charset> sortedMap = Charset.availableCharsets();
Iterator <Map.Entry <String, Charset>> iterator =
        sortedMap.entrySet().iterator();
//是否支持指定的编码格式
boolean supported = Charset.isSupported("UTF-8")//利用Charset进行指定格式的编码解码过程
String utf = "UTF-8";
//解码 
//方法一:
 try {
     String s = new String("haha".getBytes(), utf);
 } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
 }
 //方法二:
Charset UTF = Charset.forName(utf);//得到utf编码的对象
//ByteBuffer.wrap("Hello".getBytes()) //  将 byte 数组包装到缓冲区中
//decode()//将给定buffer流进行解码
CharBuffer buffer = UTF.decode(ByteBuffer.wrap("Hello".getBytes()));
System.out.println(buffer);
//编码
ByteBuffer byteBuffer = UTF.encode(buffer); //编码函数

File类详解:IO流在jdk中的 java.io目录下;

相对路径和绝对路径:
  • 绝对路径:带有盘符的路径;(window c://file linux/Unix)
  • 相对路径:不带盘符的路径称为相对路径;(.(表示当前路径) …(表示父路径))
   File file=new File("路径"); //创建一个文件
   boolean isFile() //判断file实例是否是文件 true:文件 false:非文件
   boolean isDirectory() //判断file实例是否是目录
   boolean exists() //判断file实例是否存在
   String getName() //获取当前实例的名字
   boolean createNewFile() //创建新文件\文件目录存在即返回不会抛异常
   boolean mkdir() //创建目录
   boolean delete()  //立即删除
   void deleteOnExit() //延时删除
   String[] list() //查询所有的文件列表,包含隐藏文件
   String[] list(FilenameFilter filter) //返回过滤后的数据刘表

练习:得到给定路径下所有包含filter关键字的文件,并且此文件非隐藏文件
    public static void searchFile(String path, String filter) {
        File file = new File(path); //创建一个新文件
        if(!file.exists()) return; //判断此路径文件是否存在

        if (file.isFile() && file.getName().contains(filter)) {
        //如果file是一个文件(非目录)并且文件名包含我们所需要的关键字
            System.out.println(file.getAbsoluteFile());
            //得到该文件的文件名
            return;
        }
        if (file.isDirectory()) {
        //此file是路径,说明下面还存在文件,递归查找
            searchDir(file, filter);
        }

    }

    private static void searchDir(File file, String filter) {
    //需要过滤
        FilenameFilter fileFilter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File file1 = new File(dir, name);
                return file1.isFile() && !file1.isHidden();
                //如果是文件,并且是非隐藏文件;
            }
        };
        File[] list = file.listFiles(fileFilter);
        for (int i = 0; i < list.length; i++) {
            File path1 = list[i];
            if (path1.getName().contains(filter))
                System.out.println(path1.getAbsolutePath());
                //得到绝对路径

        }

        FilenameFilter dirFilter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File file1 = new File(dir, name);
                return file1.isDirectory();
                //是否是路径
            }
        };

        File[] dir = file.listFiles(dirFilter);//得到只有路径的数组
        for (int i = 0; i < dir.length; i++) {
            File file1 = dir[i];
            searchDir(file1, filter);
            //是路径,继续进行查找
        }
    }