java

File类

File类概述

File 类的构造方法

注意:File 对象可以定位文件和文件夹。File 封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的。

public class FileDemo01 {
  public static void main(String[] args) {
    //File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File
实例。
    File f1 = new File("E:\\itcast\\java.txt");
    System.out.println(f1);
    //File(String parent, String child):从父路径名字符串和子路径名字符串创建新的
File实例。
    File f2 = new File("E:\\itcast","java.txt");
    System.out.println(f2);
    //File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File
实例。
    File f3 = new File("E:\\itcast");
    File f4 = new File(f3,"java.txt");
    System.out.println(f4);
  }
}

绝对路径和相对路径

绝对路径:从盘符开始 File file1 = new File("D:\\itheima\\a.txt");

相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。File file3 = new File("模块名\\a.txt");

常用方法

File类创建和删除功能

方法名称说明
public boolean createNewFile()创建一个新的空的文件
public boolean mkdir()只能创建一级文件夹
public boolean mkdirs()可以创建多级文件夹
public boolean delete()删除由此抽象路径名表示的文件或目录(空文件夹)

delete 方法默认只能删除文件和空文件夹,delete 方法直接删除不走回收站。

public class FileDemo02 {
  public static void main(String[] args) throws IOException {
    //需求1:我要在E:\\itcast目录下创建一个文件java.txt
    File f1 = new File("E:\\itcast\\java.txt");
    System.out.println(f1.createNewFile());
    System.out.println("--------");
    //需求2:我要在E:\\itcast目录下创建一个目录JavaSE
    File f2 = new File("E:\\itcast\\JavaSE");
    System.out.println(f2.mkdir());
    System.out.println("--------");
    //需求3:我要在E:\\itcast目录下创建一个多级目录JavaWEB\\HTML
    File f3 = new File("E:\\itcast\\JavaWEB\\HTML");
//     System.out.println(f3.mkdir());
    System.out.println(f3.mkdirs());
    System.out.println("--------");
    //需求4:我要在E:\\itcast目录下创建一个文件javase.txt
    File f4 = new File("E:\\itcast\\javase.txt");
//     System.out.println(f4.mkdir());
    System.out.println(f4.createNewFile());
  }
}

File类判断和获取功能

判断功能

方法名称说明
public boolean isDirectory()判断此路径名表示的File是否为文件夹
public boolean isFile()判断此路径名表示的File是否为文件
public boolean exists()判断此路径名表示的File是否存在

获取功能

方法名称说明
public long length()返回文件的大小(字节数量)
public String getAbsolutePath()返回文件的绝对路径
public String getPath()返回定义文件时使用的路径
public String getName()返回文件的名称,带后缀
public long lastModified()返回文件的最后修改时间(时间毫秒值)
public String list()返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File listFiles()返回此抽象路径名表示的目录中的文件和目录的 File 对象数组
public class FileDemo04 {
  public static void main(String[] args) {
    //创建一个File对象
    File f = new File("myFile\\java.txt");
//     public boolean isDirectory():测试此抽象路径名表示的File是否为目录
//     public boolean isFile():测试此抽象路径名表示的File是否为文件
//     public boolean exists():测试此抽象路径名表示的File是否存在
    System.out.println(f.isDirectory());
    System.out.println(f.isFile());
    System.out.println(f.exists());
//     public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
//     public String getPath():将此抽象路径名转换为路径名字符串
//     public String getName():返回由此抽象路径名表示的文件或目录的名称
    System.out.println(f.getAbsolutePath());
    System.out.println(f.getPath());
    System.out.println(f.getName());
    System.out.println("--------");
//     public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数
//     public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象
数组
    File f2 = new File("E:\\itcast");
    String[] strArray = f2.list();
    for(String str : strArray) {
      System.out.println(str);
    }
    System.out.println("--------");
    File[] fileArray = f2.listFiles();
    for(File file : fileArray) {
//       System.out.println(file);
//       System.out.println(file.getName());
      if(file.isFile()) {
        System.out.println(file.getName());
      }
    }
  }
}

File类的遍历功能

方法名称说明
public String list()获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
public File listFiles()(常用)获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)

listFiles 方法注意事项:

  • 当文件不存在时或者代表文件时,返回 null。
  • 当文件对象代表一个空文件夹时,返回一个长度为 0 的数组。
  • 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回。
  • 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回,包含隐藏文件。
  • 当没有权限访问该文件夹时,返回 null。

IO流

IO流概述

IO 流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载。

I 表示 intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。

O 表示 output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。

IO流的分类

按照数据的流向

  • 输入流:读数据
  • 输出流:写数据

按照数据类型来分

  • 字节流:字节输入流、字节输出流
  • 字符流:字符输入流、字符输出流

总结流的四大类:

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
  • 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。

IO 流的使用场景

  • 如果操作的是纯文本文件,优先使用字符流
  • 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
  • 如果不确定文件类型,优先使用字节流。字节流是万能的流

字节流

字节输入流:每次读取一个字节

文件字节输入流:FileInputStream

  • 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。

字节输入流

FileInputStream(String name) :通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name 命名。

字节输入流读取数据的步骤

  • 创建字节输入流对象
  • 调用字节输入流对象的读数据方法
  • 释放资源
构造器说明
public FileInputStream(File file)创建字节输入流管道与源文件对象接通
public FileInputStream(String pathname)创建字节输入流管道与源文件路径接通
方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

字节输入流

FileInputStream(String name) :通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name 命名

字节输入流读取数据的步骤

  • 创建字节输入流对象
  • 调用字节输入流对象的读数据方法
  • 释放资源
public class FileInputStreamDemo01 {
  public static void main(String[] args) throws IOException {
    //创建字节输入流对象
    //FileInputStream(String name)
    FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
    int by;
    /*
      fis.read():读数据
      by=fis.read():把读取到的数据赋值给by
      by != -1:判断读取到的数据是否是-1
    */
    while ((by=fis.read())!=-1) {
      System.out.print((char)by);
    }
    //释放资源
    fis.close();
  }
}

字节输入流:每次读取一个字节数组

public int read(byte b) :从输入流读取最多 b.length 个字节的数据。返回的是读入缓冲区的总字节数 ,也就是实际的读取字节个数。

方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte buffer)每次使用字节数组来读取数据,返回读取的字节个数,如果没有可读返回-1
public class FileInputStreamDemo02 {
  public static void main(String[] args) throws IOException {
    //创建字节输入流对象
    FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
    /*
      hello\r\n
      world\r\n
      第一次:hello
      第二次:\r\nwor
      第三次:ld\r\nr
    */
    byte[] bys = new byte[1024]; //1024及其整数倍
    int len;
    while ((len=fis.read(bys))!=-1) {
      System.out.print(new String(bys,0,len));
    }
    //释放资源
    fis.close();
  }
}

问题

1、使用字节流读取中文输出乱码,如何使用字节输入流读取中文输出不乱码呢?

  • 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

2、直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,字节数组可能引起内存溢出。

字节输入流:读取文件的全部字节

方法名称说明
public int read(byte buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

方式二:官方为字节输入流 InputStream 提供了如下 API 可以直接把文件的全部数据读取到一个字节数组中

方法名称说明
public byte readAllBytes() throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回

1、直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

如果文件过大,字节数组可能引起内存溢出。

字节流复制文本文件

把"E:\itcast\ceshi.txt"复制到模块目录下的"ceshi.txt"

实现步骤

  • 复制文本文件,其实就把文本文件的内容从一个文件中读取出来 (数据源),然后写入到另一个文件中(目的地)

数据源:

  • E:\ceshi.txt --- 读数据 --- InputStream --- FileInputStream

目的地:

  • myByteStream\ceshi.txt --- 写数据 --- OutputStream --- FileOutputStream
public class CopyTxtDemo {
  public static void main(String[] args) throws IOException {
    //根据数据源创建字节输入流对象
    FileInputStream fis = new FileInputStream("E:\\itcast\\窗里窗外.txt");
    //根据目的地创建字节输出流对象
    FileOutputStream fos = new FileOutputStream("myByteStream\\窗里窗外.txt");
    //读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
    int by;
    while ((by=fis.read())!=-1) {
      fos.write(by);
    }
    //释放资源
    fos.close();
    fis.close();
  }
}

字节流复制图片

把"E:\mn.jpg"复制到模块目录下的"mn.jpg"

实现步骤

  • 根据数据源创建字节输入流对象
  • 根据目的地创建字节输出流对象
  • 读写数据,复制图片 (一次读取一个字节数组,一次写入一个字节数组)
  • 释放资源
public class CopyJpgDemo {
  public static void main(String[] args) throws IOException {
    //根据数据源创建字节输入流对象
    FileInputStream fis = new FileInputStream("E:\\itcast\\mn.jpg");
    //根据目的地创建字节输出流对象
    FileOutputStream fos = new FileOutputStream("myByteStream\\mn.jpg");
    //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
    byte[] bys = new byte[1024];
    int len;
    while ((len=fis.read(bys))!=-1) {
      fos.write(bys,0,len);
    }
    //释放资源
    fos.close();
    fis.close();
  }
}

字节输出流:写字节数据到文件

字节输出流:FileOutputStream(String name) :创建文件输出流以指定的名称写入文件

作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。

使用字节输出流写数据的步骤

  • 创建字节输出流对象 (调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
  • 调用字节输出流对象的写数据方法
  • 释放资源 (关闭此文件输出流并释放与此流相关联的任何系统资源)
构造器说明
public FileOutputStream(File file)创建字节输流管道与源文件对象接通
public FileOutputStream(File fileboolean append)创建字节输流管道与源文件对象接通,可追加数据
public FileOutputStream(String filepath)创建字节输流管道与源文件路径接通
public FileOutputStream(String filepathboolean append)创建字节输流管道与源文件路径接通,可追加数据

文件字节输出流(FileOutputStream)写数据出去的 API

写数据的方法分类

方法名称说明
public void write(int a)写一个字节出去
public void write(byte buffer)写一个字节数组出去
public void write(byte buffer , int pos , int len)写一个字节数组的一部分出去。

流的关闭与刷新

方法名称说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

IO流:资源释放的方式-字节流写数据加异常处理

finally 特点 被 finally 控制的语句一定会执行,除非 JVM 退出


```java
public class FileOutputStreamDemo04 {
  public static void main(String[] args) {
    //加入finally来实现释放资源
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream("myByteStream\\fos.txt");
      fos.write("hello".getBytes());
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if(fos != null) {
        try {
          fos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

待补充