当前位置 博文首页 > 最爱吃鱼罐头:万字长文超硬核详细学习系列——深入浅出IO基础流

    最爱吃鱼罐头:万字长文超硬核详细学习系列——深入浅出IO基础流

    作者:[db:作者] 时间:2021-08-29 10:08

    茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

    愿你在未来的日子,保持热爱,奔赴山海!

    I/O基础流

    Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。 而流是一组有序,有起点和有终点的数据序列,其本质就是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

    作用:为数据源和目的地建立一个输送通道。

    1. File类

    IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件。

    1.1 概述

    java.io.File 类是文件和目录路径名的抽象表示。File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹,主要可以用于文件和目录的创建、查找和删除等操作。

    注意: File表示的是文件和目录信息,而不表示文件的内容。

    1.2 构造方法

    public File(String pathname) {} //文件的绝对路径
    
    public File(String parent, String child) {}//指定父文件绝对路径、子文件绝对路径
    
    public File(File parent, String child) {}//指定父文件、子文件相对路径
    
    public File(URI uri) {} //文件的URI地址
    
    //下面这两个是File类中私有的构造函数,外面不能调用
    private File(String pathname, int prefixLength) {}
    
    private File(String child, File parent) {}public File(String pathname) {}
    

    可以看到,File类的构造函数有6个:4个公共构造函数,2个私有构造函数。

    而常用的构造方法有:

    • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

    看下代码演示:

    //public File(String pathname)// 文件路径名
    String pathName = "E:\\aaa.txt";
    File file = new File(pathName);
    
    //public File(String parent, String child) 通过父路径和子路径字符串
    String parent = "E:\\aaa";
    String child = "bbb.txt";
    File file2 = new File(parent, child);
    
    // public File(File parent, String child) 通过父级File对象和子路径字符串
    File parentDir = new File("E:\\aaa");
    String child2 = "bbb.txt";
    File file3 = new File(parentDir, child2);
    

    注意:不知道大家有没有注意到我写文件路径名是这样的"E:\\aaa" ,可是我们文件路径不是"E:\aaa" 这样吗?

    因为在字符串中\是转义字符,如果你只是一个\,会认为你这个是转义字符,所以需要两个。

    贴士:

    1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
    2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

    1.3 File的常用方法

    以下的需要文件是基于这个a.txt

    1.3.1 获取功能

    • public String getAbsolutePath() : 返回此File的绝对路径名字符串。
    • public String getPath() : 将此File转换为路径名字符串。
    • public String getName() : 返回由此File表示的文件或目录的名称。
    • public long length() : 返回由此File表示的文件的长度。
    • public long lastModified() : 获取最后一次的修改时间,毫秒值

    代码演示下:

    public class FileTest {
        public static void main(String[] args) {
            File file = new File("E:\\demo\\a.txt");
    
            //public String getAbsolutePath():获取绝对路径
            System.out.println("getAbsolutePath:" + file.getAbsolutePath());//getAbsolutePath:E:\demo\a.txt
    
            //public String getPath():获取相对路径
            System.out.println("getPath:" + file.getPath());//getPath:E:\demo\a.txt
    
            //public String getName():获取名称
            System.out.println("getName:" + file.getName());//getName:a.txt
    
            //public long length():获取长度。字节数
            System.out.println("length:" + file.length());//length:20
    
            //public long lastModified():获取最后一次的修改时间,毫秒值
            System.out.println("lastModified:" + file.lastModified());//lastModified:1606645407343
    
            //转换下格式毫秒值。
            Date time = new Date(file.lastModified());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String s = sdf.format(time);
            System.out.println(s);//2020-11-29 18:23:27
        }
    }
    

    想必这个应该不用多讲吧,看了就会用吧,直接调用就行了。

    1.3.2 判断功能

    • public boolean isDirectory() : 判断是否是目录
    • public boolean isFile() : 判断是否是文件
    • public boolean exists() : 判断是否存在
    • public boolean canRead() : 判断是否可读
    • public boolean canWrite() : 判断是否可写
    • public boolean isHidden() :判断是否隐藏

    像往常一样,继续来一波演示,走起:

    public class FileTest2 {
        public static void main(String[] args) {
            File file = new File("E:\\demo\\a.txt");
    
            //public boolean isDirectory():判断是否是目录
            System.out.println("isDirectory: " + file.isDirectory());//isDirectory: false
    
            //public boolean isFile():判断是否是文件
            System.out.println("isFile: " + file.isFile());//isFile: true
    
            //public boolean exists():判断是否存在
            System.out.println("exists: " + file.exists());//exists: true
    
            //public boolean canRead():判断是否可读
            System.out.println("canRead: " + file.canRead());//canRead: true
    
            //public boolean canWrite():判断是否可写
            System.out.println("canWrite: " + file.canWrite());//canWrite: true
    
            //public boolean isHidden():判断是否隐藏
            System.out.println("isHidden: " + file.isHidden());//isHidden: false
        }
    }
    

    不多说,看代码!看了就懂了!

    1.3.3 创建功能

    • public boolean createNewFile(): 创建文件 如果存在这样的文件,就不创建了
    • public boolean mkdir() :创建文件夹 如果存在这样的文件夹,就不创建了
    • public boolean mkdirs() : 创建文件夹,如果父文件夹不存在,会帮你创建出来

    先看下创建前的文件信息:

    然后像往常一样,继续来一波演示,走起:

    public class FileTest3 {
        public static void main(String[] args) throws IOException {
            //public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
            // 在e盘文件夹demo下创建一个文件夹hello
            File file = new File("E:\\demo\\hello"); //根据上面的文件信息看到这个hello文件夹是没有的
            System.out.println("mkdir: " + file.mkdir());
            System.out.println("再来判断下文件夹是否存在: " + file.exists());
    
            //public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
            //在e盘目录demo下的文件夹hello创建一个文件hello.txt
            File file2 = new File(file,"\\hello.txt");//在上面已经创建了hello文件夹
            System.out.println("createNewFile: " + file2.createNewFile());
            System.out.println("再来判断下文件是否存在: " + file2.exists());
    
            //public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
            File file3 = new File("E:\\demo\\world\\world");//能不能两级文件夹直接创建出来呢
            System.out.println("mkdirs: " + file3.mkdirs());
            System.out.println("再来判断下文件夹是否存在: " + file3.exists());
        }
    }
    

    第一次执行结果可以看到:

    mkdir: true
    再来判断下文件夹是否存在: true
    createNewFile: true
    再来判断下文件是否存在: true
    mkdirs: true
    再来判断下文件夹是否存在: true
    

    而现在是不是文件或者文件夹都创建出来了,我们再运行一次会怎样呢?

    mkdir: false
    再来判断下文件夹是否存在: true
    createNewFile: false
    再来判断下文件是否存在: true
    mkdirs: false
    再来判断下文件是否存在: true
    

    方法调用上都为false,代表了如果有文件或者有文件夹了就都不再创建了。

    提一个小问题,在创建的方法中哪个有可能会抛出异常的呢? 看下代码,觉得那个可能会出错呢

    File file4 = new File("E:\\world\\world2"); 
    System.out.println("mkdir: " + file4.mkdir());
    
    File file5 = new File("E:\\world\\world2");
    System.out.
    
    下一篇:没有了