欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习笔记_06_File类与IO流

程序员文章站 2024-03-04 16:50:17
...

1.File类

  • 概述:java.io.File类是文件和目录路径名的抽象表示形式。主要用于文件和目录的创建、查找和删除等操作

1.1 常用方法

  • File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
  • 其方法大致可以分为三类(包含以下关键词):file(与文件相关的方法)、directory(与文件夹/目录相关的方法)、path(与路径相关的方法)

1.1.1静态成员

  • public static final String pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串(windows是;linux是:)

  • public static final String separator:与系统有关的默认文件名称分隔符(windows:反斜杠\ linux:正斜杠/)

  • public static final char pathSeparatorChar:与系统有关的路径分隔符

  • public static final char separatorChar:与系统有关的默认名称分隔符

这里我们在写操作路径的时候要注意,千万别写死了,因为操作系统的缘故

1.1.2构造方法

  • public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
    • 创建File对象只是把字符串路径(pathname)封装为File对象,不考虑路径的真假情况(即pathname可以为空),重写了toString方法
  • public File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
    • 好处:父路径与子路径可以单独书写,使用灵活;子、父路径都可以变化
  • public File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例
    • 好处:父路径与子路径可以单独书写,使用灵活;子、父路径都可以变化;父路径是File类型,可以使用File类中的方法对路径进行一些操作

1.1.3常用获取方法

这里将File类的方法进行了功能上的分类,先介绍常用的获取方法

  • public String getAbsolutePath():返回此File的绝对路径名字符串
  • public String getPath():将此File转换为一个路径名字符串(File类重写了toString方法,其实就是调用了getPath()方法)file写的是什么,就获取什么路径
  • public String getName():返回由此File表示的文件或目录的名称(就是获取构造方法传递路径的结尾部分)
  • public long length():返回由此File表示的文件的长度(获取的是构造方法指定的文件的大小,以字节为单位)
    • 注意:
      文件夹是没有大小概念的,不能获取文件夹的大小
      如果构造方法中给出的路径不存在,那么length方法返回0

1.1.4常用判断方法

  • public boolean exists():判断此File表示的文件或目录是否存在(判断路径是否存在)
  • public boolean isDirectory():判断此File表示的文件是否是一个目录(判断给定的路径是否以文件夹结尾)
  • public boolean isFile():判断此File表示的文件是否是一个标准文件(判断给定的路径是否以文件结尾)
  • 电脑硬盘中只有文件夹/文件,即isFile和isDirectory是互斥的方法,当前互斥前提是给定路径存在

1.1.5常用增删方法

  • public boolean createNewFile() throws IOException:当且仅当不存在具有此File指定名称的文件时,创建一个新的空文件

    • 注意:此方法只能创建文件,且创建文件的路径必须存在(否则会抛出异常)
    • 返回值:如果文件不存在,创建文件,并返回true
      如果文件存在,不会创建,并返回false
  • public boolean delete():删除由此File表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除

    • 返回值:
      true:文件/文件夹删除成功

      ​ false:文件夹中有内容,不会删除;构造方法中路径不存在

    • 注意:此方法是直接在硬盘中删除文件/文件夹,不走回收站,删除要谨慎

  • public boolean mkdir():创建由此File指定的目录(只能创建单级空文件夹)

    • 返回值参考creatNewFile方法
  • public boolean mkdirs():创建由此File指定的目录,包括所有必需但不存在的父目录(即可创建单级空文件夹,也可创建多级)

    • 返回值参考creatNewFile方法

1.1.6常用遍历方法

  • public String[] list():返回一个字符串数组,表示该File目录中的所有子文件或目录

  • public File[] listFiles():返回一个File数组,表示该File目录中所有的子文件或目录

  • 注意:
    list方法和listFiles方法遍历的是构造方法中给出的目录,如果构造方法中给出的目录的路径不存在,会抛出空指针异常;如果构造方法中给出的路径不是一个目录也会抛出空指针异常

  • public File[] listFiles(FileFilter filter):

    • java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。

      作用:用来过滤文件的方法

      抽象方法:用来过滤文件的方法

      boolean accept(File pathname):测试指定抽象路径名是否应该包含在某个路径名列表中

      参数:File pathname:就是使用listFiles方法遍历目录得到的每一个文件对象

  • public File[] listFiles(FilenameFilter filter)

    • java.io.FilenameFilter接口:用于过滤器文件名

      抽象方法:boolean accept(File dir, String name)
      参数:
      File dir:构造方法中传递的被遍历的目录
      String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称

  • 注意:两个过滤器接口是没有实现类的,需要我们自己重写实现类,重写过滤的方法accept方法,自定义过滤规则

1.2 相对路径和绝对路径

  • 路径分为绝对路径与相对路径

    • 绝对路径:是一个完整的路径
      以盘符(c:,D:)开始的路径,如

      ​ c:\\a.txt
      ​ D:\\CODE\\JavaCode\\JavaSE\\基础语法\\123.txt

    • 相对路径:是一个简化的路径
      相对指的是相对于当前项目的根目录( D:\\CODE\\JavaCode\\JavaSE\\基础语法)
      如果使用当前项目的根目录,路径可以简化写成

      D:\\CODE\\JavaCode\\JavaSE\\基础语法\\123.txt ==>简化为:123.txt(可以省略根目录)

    • 注意:

      1. 路径不区分大小写
      2. 路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

2.IO流-字节流

先用一张图来大致了解下IO流分类

Java学习笔记_06_File类与IO流

2.1字节流

说在前面:一切皆为字节。即一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都是一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。因为我们在操作流的时候,无论使用什么样的流对象,其底层传输的始终未二进制数据

2.2字节输出流

  • java.io.OutputStream:字节输出流,此抽象类是表示输出字节流的所有类的超类
  • 成员方法:
    • public void close():关闭此输出流并释放与此流有关的所有系统资源
    • public void flush():刷新此输出流并强制写出所有缓冲的输出字节
    • public void write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流
    • public void write(byte[] b,int off,int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
    • public abstract void write(int b):将指定的字节写入此输出流

2.3 文件字节输出流

因为OutputStream是抽象类,所以我们得使用其继承类来操作流对象

  • java.io.FileOutputStream extends OutputStream,其作业把内存中的数据写入到硬盘的文件中

  • 常用构造方法:

    • public FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流

      • 参数:(即写入数据的目的地)

        File file:目的地是一个文件

    • public FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流

      • 参数:(即写入数据的目的地)

        String name:目的地是一个文件的路径

  • 构造方法的作用

    1. 创建FileOutputStream流对象
    2. 会根据构造方法中传递的文件/文件路径,创建一个空的文件
    3. 会把FileOutputStream对象指向创建好的文件
  • 写入方法

    • public void write(int b):将指定字节写入此文件输出流
    • public void write(byte[] b):将 b.length 个字节从指定 byte 数组写入此文件输出流中(一次写入多个字节)
      • 如果写入的第一个字节是正数(0-127),那么显示的时候会查询ASCII表
      • 如果写入的第一个字节是负数,那么第一个字节和第二个字节会组成一个中文显示,查询系统默认码表(GBK)
    • public void write(byte[] b, int off,int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流
  • 上面都是写入字符的,下面演示如何写入字符串

    • public byte[] getBytes():将字符串转换为字符数组

    • 代码展示

      package com.file;
      
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.util.Arrays;
      
      public class Demo01 {
          public static void main(String[] args) throws IOException {
              FileOutputStream fos = new FileOutputStream("D:\\CODE\\JavaCode\\JavaSE\\基础语法\\src\\com\\file\\a.txt");
      
              byte[] bytes = "你好".getBytes();
              fos.write(bytes);
              System.out.println(Arrays.toString(bytes));
              fos.close();//流用完一定要记得释放
        //下面步骤是即时删除刚才写入的测试文本,可以忽略     
             File file = new File("D:\\CODE\\JavaCode\\JavaSE\\基础语法\\src\\com\\file\\a.txt");
              file.delete();
      
          }
      }
      
  • 数据的续写和换行写

    续写

    • public FileOutputStream(File file,boolean append):创建一个向指定 File 对象表示的文件中写入数据的文件输出流

    • public FileOutputStream(String name,boolean append):创建一个向具有指定 name 的文件中写入数据的输出文件流

    • append为true创建对象不会覆盖原文件,继续在文件的末尾追加写数据

      append为false,创建对象会覆盖源文件

    换行即写换行符号

    • windows:\r\n
    • linux:/n
    • mac:/r

2.4字节输入流

  • java.io.InputStream:字节输入流,此抽象类是表示字节输入流的所有类的超类
  • 成员方法
    • public int read():从输入流中读取数据的下一个字节,读取到文件的末尾返回-1
    • public int read(byte[] b):从输入流中读取一定量的字节,并将其存储在缓冲区数组b中(数组长度一般定义1024或其整数倍)
      • 参数:数组起到缓冲作用
      • 返回值:每次读取到的有效字节个数(-1仍为结束标识位)
    • public void close():关闭此输出流并释放与此流有关的所有系统资源

2.5文件字节输入流

  • public class FileInputStream extends InputStream,其作用是把硬盘文件中的数据,读取到内存中使用

  • 构造方法

    • public FileInputStream(File file)

    • public FileInputStream(String name)

    • 参数:

      File file:文件

      String name:文件的路径

  • 构造方法的作用

    1. 会创建一个FileInputStream对象
    2. 会把FileInputStream对象指向构造方法中要读取的文件

3.IO流-字符流

  • 使用字节流读取中文时可能会读取中文不完整,从而产生乱码(和编码格式有关,GBK每个中文占两个字节,而UTF-8每个中文占3个字节),因此提供可字符流来以字符为单位读取数据,专门处理文本文件

3.1字符输入流

  • java.io.Reader:字符输入流,此抽象类是字符输入流的最顶层的父类
  • 成员方法
    • public int read():读取单个字符
    • public int read(char[] cbuf):一次读取多个字符,将字符读入数组(-1仍未结束标识符)
    • void close():释放与之相关的流资源

3.2文件字符输入流

  • java.io.FileReader:文件字符输入流,把硬盘文件中的数据以字符的方式读取到内存中
  • 构造方法
    • public FileReader(File file)
    • public FileReader(String fileName)
    • 参数:读取文件的数据源,具体参数同字节流
  • 构造方法的作用
    1. 创建一个FileReader对象
    2. 会把FileReader对象指向要读取的文件

3.3字符输出流

  • java.io.Writer,此抽象类是所有字符输出流的最顶层的父类
  • 成员方法
    • void write(char[] cbuf):写入字符数组
    • void write(int c):写入单个字符
    • void write(char[] cbuf, int off, int len):写入字符数组的某一部分
    • void write(String str):写入字符串
    • void write(String str, int off, int len):写入字符串的某一部分
    • void flush():刷新该流的缓冲(可以继续使用流对象)
    • void close():关闭此流,但要先刷新它(会刷新缓冲区,但是流对象不可继续使用)

3.4文件字符输出流

  • java.io.FileWriter:文件字符输出流,其作用是把内存中的数据写入到文件中

  • 构造方法

    • FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象
    • FileWriter(String fileName):根据给定的文件名构造一个 FileWriter 对象
    • 参数:写入数据的目的地,具体参数同字节流
  • 构造方法的作用

    1. 会创建一个FileWriter对象

    2. 会根据构造方法中传递的文件/文件的路径,创建文件

    3. 会把FileWriter对象指向创建好的文件

  • 字节输出流的使用步骤(多了一步刷新的步骤)

    1. 创建FileWriter对象
    2. 使用FileWriter中的方法write,把数据写入到内存缓冲区
    3. 使用FileWriter中的方法flush,把内存缓存区的数据,刷新到文件中
    4. 释放资源(会先把内存缓冲区的数据刷新到文件中)
  • 字符流的续写和换行和字节流用法相同,就不过多赘述了

  • 流中异常的处理(这里可以把可能产生异常的代码选择,ctrl+alt+t直接try catch即可)

    package com.stream;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /*
        JDK7新特性
            在try的后边可以增加一个(),在括号中可以定义流对象
            那么这个流对象的作用域就在try中有效
            try中的代码执行完毕,会自动把流对象释放,不用写finally
            格式:
                try(定义流对象;定义流对象...){
                可能会产生异常的代码
                }catch(异常类变量 变量名){
                异常的处理逻辑
                }
     */
    public class DemoException {
        public static void main(String[] args) {
    
            try {
                FileInputStream fis = new FileInputStream("d:\\a.txt");
                FileOutputStream fos = new FileOutputStream("f:\\a.txt");
                int len = 0;
                while ((len=fis.read())!=-1){
                    fos.write(len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
相关标签: myJava