JavaSE学习笔记day16

今日内容

一、作业
二、File
三、IO流
四、字节输入&输出流

零、 复习昨日

一、作业

见答案

二、File

2.1 介绍

File,通过一个路径代表文件或者文件夹

File类是文件(file)和目录(directory)路径名的抽象表示形式。

说人话: 一个File类代表一个文件或者一个文件夹的路径

特殊之处:

  1. 但是这个路径不一定要真实存在
  2. 路径有分
    1. 绝对路径 (带完整路径,盘符等信息)
    2. 相对路径 (没有盘符,只有文件名等信息,相对于当前项目名下)

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"));
    }

三、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, 怎么分类,分别适合场景
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二手Java程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值