今日内容
上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、作业
二、File
三、IO流
四、字节输入&输出流
零、 复习昨日
见晨考
一、作业
见答案
 
二、File
2.1 介绍
File,通过一个路径代表文件或者文件夹
File类是文件(file)和目录(directory)路径名的抽象表示形式。
说人话: 一个File类代表一个文件或者一个文件夹的路径
特殊之处:
- 但是这个路径不一定要真实存在
 - 路径有分
 
- 绝对路径 (带完整路径,盘符等信息)
 - 相对路径 (没有盘符,只有文件名等信息,相对于当前项目名下)
 
2.2 构造方法
- File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
 - File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
 - File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
 
/**
 * 测试构造方法
 */
private static void testConstructor() {
    // 通过字符串代表文件/文件夹对象
    File file = new File("E:\\a.txt");
    System.out.println(file );
    // 通过父级路径+ 子级路径代表 一个文件/文件夹对象
    File file2 = new File("E:\\A","a.txt"); // E:\A\a.txt
    // 以上这种,比较适合后续做文件上传使用
    String fuPath = "E:\\A";
    File parent = new File(fuPath);
    File file3 = new File(parent, "a.txt"); // E:\A\a.txt
}
 
2.3方法
创建功能
- boolean createNewFile() 当且仅当不存在此路径名表示的
 文件时,创建一个新的空文件。- boolean mkdir()
 创建此抽象路径名指定的目录/文件夹。- boolean mkdirs()
 创建多层级的文件夹。
/**
 * 创建文件/文件夹的方法
 */
private static void testCreate() throws IOException {
    // 通过字符串代表文件对象
    File file = new File("E:\\a.txt");
    // 创建不存在的新文件
    boolean newFile = file.createNewFile( );
    System.out.println("是否创建成功? " + newFile );
    // 创建文件夹,不能使用已经存在的文件对象去调用方法
    File file2 = new File("E:/B");
    boolean mkdir = file2.mkdir( );
    System.out.println("创建文件夹? " + mkdir );
    // 创建多层文件夹
    File file3 = new File("E:\\C\\CC\\CCC");
    boolean mkdir1 = file3.mkdirs( );
    System.out.println("创建多层文件夹? " + mkdir1 );
}
 
获取功能
- File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
 - String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
 - String getName()返回由此抽象路径名表示的文件或目录的名称。
 - String getPath()将此抽象路径名转换为一个路径名字符串。
 - String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
 - File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
 - long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
 - long length() 返回由此抽象路径名表示的文件的长度。
 
    /**
     * 测试关于获得内容的方法
     */
    private static void testGet() {
        File file = new File("E:\\a.txt");// 绝对路径
        // 相对路径,相对于当前项目根路径
        File file2 = new File("a.txt");
        // - File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
        File absoluteFile = file2.getAbsoluteFile( );
        System.out.println(absoluteFile );
        // - String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
        String absolutePath = file2.getAbsolutePath( );
        System.out.println(absolutePath );
        // - String getName()返回由此抽象路径名表示的文件或目录的名称。
        System.out.println(file.getName() );
        System.out.println(file2.getName() );
        // - String getPath() 获得构造方法中的路径
        System.out.println(file.getPath() );
        System.out.println(file2.getPath() );
        System.out.println("----------------" );
        File aDir = new File("E:\\A");
        // - String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
        String[] arr = aDir.list( );
        System.out.println(Arrays.toString(arr ) );
        // - File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
        File[] files = aDir.listFiles( );
        System.out.println(Arrays.toString(files ) );
        File aFile = new File("E:\\A\\a.txt");
        // - long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
        System.out.println(aFile.lastModified() );
        long l = aFile.lastModified( );
        // 由指定毫秒值创建Date对象
        Date lastModified = new Date(l);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        String format = sdf.format(lastModified);
        System.out.println(format );
        // - long length() 返回由此抽象路径名表示的文件的长度。
        System.out.println( aFile.length());
    }
 
判断功能
- boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
 - boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
 - boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
 - boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
 
   /**
     * 测试判断功能
     */
    private static void testPanduan() throws IOException {
        // - boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
        File file = new File("b.txt");
        // 如果不存在时,创建该文件
        if (!file.exists()) {
            file.createNewFile();
        }
        // - boolean isDirectory() 判断是否是文件夹
        System.out.println(file.isDirectory() );
        // - boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
        System.out.println(file.isFile() );
        // - boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
        System.out.println("是否隐藏? " + file.isHidden() );
        File file1 = new File("E:\\IDEA-WorkSpaceJava2301\\day21");
        String[] list = file1.list( );
        for (String s : list) {
            System.out.println(s );
        }
    }
 
删除&重命名
- boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
 - boolean delete() 删除此抽象路径名表示的文件或目录。
 
  private static void test() {
        File file = new File("E:\\A");
        // - boolean delete()  删除此抽象路径名表示的文件或目录。
        // 只能删除空文件夹
        boolean delete = file.delete( );
        System.out.println(delete );
        File file1 = new File("E:\\a.txt");
        // - boolean renameTo(File dest)  重新命名此抽象路径名表示的文件。
        // 改后路径与原来一致,就是单纯重命名
        // file1.renameTo(new File("E:\\aaa.txt"));
        // 改后路径与原来不一致,那就是移动并重命名
        file1.renameTo(new File("E:\\B\\aaa.txt"));
    }
 
2.4 练习
1 设计方法,传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)
public static void findTxt(String path){
    File file = new File(path);
    if(!file.exists()) {
        System.out.println("该路径指定的文件不存在!");
        return;
    }
     if(!file.isDirectory()) {
        System.out.println("该路径指定的文件不是文件夹!");
        return;
    }
    String[] nameArr = file.list();
    for(String name : nameArr) {
        if(name.endsWith("txt")) {
            System.out.println("记事本文件: " + name);
        }
    }
}
 
2 设计方法,传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)
public static void deleteFile(String path){
    File file = new File(path);
    if(!file.exists()) {
        System.out.println("该路径指定的文件不存在!");
        return;
    }
     if(!file.isDirectory()) {
        System.out.println("该路径指定的文件不是文件夹!");
        return;
    }
    File[] fileArr = file.listFiles();
    for(File f : fileArr) {
        if(f.isFile()) {
           f.delete();
        }
    }
}
 
ps: 该题可以扩展,给定路径删除该文件夹
三、IO流
流的概念:
在程序中,数据需要传输(移动),⽐如磁盘上的数据需要出现在显⽰器上,就需要进⾏数据传输。 在Java中进⾏数据传输的技术就是“流”.

IO - Input & Output - 输入 & 输出

IO按类型分类
- 字节流
 
- 字节输入流
 - 字节输出流
 - 字符流
 
- 字符输入流
 - 字符输出流
 
IO按方向分类
- 输入流
 - 输出流
 
四、字节输入&输出流
字节输入流和字节输出流顶层设计是
抽象类
- InputStream 输入字节流
 
- 一般使用其子类FileInputStream
 - OutputStream 输出字节流
 
- 一般使用其子类FileOutputStream
 
4.1 FileInputStream
FileInputStream用于读取诸如图像数据之类的原始字节流(二进制文件)
构造方法
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
        FileInputStream in = new FileInputStream("a2.txt");
        File file = new File("a2.txt");
        FileInputStream in2 = new FileInputStream(file);
 
方法
- int read() 一次读取一个字节
 - void close() 关流
 
   public static void main(String[] args) throws IOException {
        // 以文件创建流
        FileInputStream in = new FileInputStream("a.txt");
        // 开始读取
        // 一次读取一个字节
        // int i1 = in.read();
        // System.out.println((char)i1 );
        //
        // int i2 = in.read( );
        // System.out.println((char)i2 );
        //
        // int i3 = in.read( );
        // System.out.println((char)i3 );
        //
        // // 读到末尾(读完了)返回-1
        // int i4 = in.read( );
        // System.out.println(i4 );
        int r = -1;
        while((r = in.read()) != -1) {
            System.out.println((char)r );
        }
        // 关流,释放资源
        in.close();
    }
 
read() 一次读一个,有点"慢"
read(byte[] ) 一次读取一个数组大小的数据,比较快
    public static void main(String[] args) throws IOException {
        // 以文件创建流
        FileInputStream in = new FileInputStream("a.txt");
        byte[] bytes = new byte[4];
        System.out.println(Arrays.toString(bytes ) );
        // 可以将元素一次读取到数组中
        in.read(bytes);
        System.out.println(Arrays.toString(bytes ) );
    }
 
4.2 FileOutputStream
FileOutputStream是文件输出流,用于将数据写入
File
适合用于写入诸如图像数据之类的原始字节的流(二进制)
构造方法
- FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
 - FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
 - FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
 - FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
 方法
- void write(int b) 将指定字节写入此文件输出流。
 - void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
 
    public static void main(String[] args) throws IOException {
        // FileOutputStream fos = new FileOutputStream("a.txt");
        // 构造方法中参数2, boolean append,意思是是否对该文件内容追加写入
        // 指定true,追加内容到原文件
        // 指定false,覆盖原文件内容
        // 不指定的话默认是false
        // 特殊的,写出的文件即使不存在,也会先创建文件再写入
        FileOutputStream fos = new FileOutputStream("c.txt",true);
        // 写一个
        //fos.write(67);
        // 支持一次写多个数据
        byte[] bytes = {65,66,67,68,69};
        fos.write(bytes);
        fos.close();
        System.out.println("写完啦~" );
    }
 
4.3 使用捕获异常的方式编程
    public static void main(String[] args) {
        FileInputStream in = null;
        try {
            in = new FileInputStream("a.txt");
            int r = -1;
            while((r = in.read()) != -1) {
                System.out.println(r );
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                in.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
4.4 练习: 拷贝图片
将D:\justdoit.jpg图片拷贝一份到E:\jiushigan.jpg
思路: 从d盘读取,写到e盘
    public static void main(String[] args) throws Exception {
        // 将读取转为输入字节流
        FileInputStream in = new FileInputStream("E:\\B\\justdoit.jpg");
        // 将图片写出
        FileOutputStream out = new FileOutputStream("E:\\C\\jiushigan.jpg");
        int r = -1;
        while ((r = in.read()) != -1) {
            out.write(r);
        }
        in.close();
        out.close();
        System.out.println("拷贝完毕" );
    }
 
改造成trycatch代码再写一遍
五、 总结
file 关于文件操作
  会创建文件对象,创建文件夹/文件,判断文件夹/文件
  
输入/输出字节流
	6行标准代码
会说: 什么是IO, 怎么分类,分别适合场景
                


















