泥瓦匠
🔥🔥 点击领取 ChatGPT Plus 正版账号

Java IO File 用法案例和源码解析

🔥🔥 点击领取 ChatGPT Plus 正版账号

记得Java源码是集合开始看的,写了一 集合 相关的文章,受到不错的评价。我依旧会读到老写到老,并生动形象的写出来心得体会。

这次依旧是图解,我研究IO这块。 Java IO - File的要点,应该是 1、跨平台问题的解决 2、文件的安全 3、文件的检索方法

一、File 代码 Demo

代请看一个简单的小demo:
ps:开源项目java-core-learning地址 https://github.com/JeffLi1993

import java.io.File;
import java.util.Arrays;

/*
 * 列出目录并排序
 */
public class DirListT {
    public static void main(String[] args) {
        // 获取当前目录
        File path = new File(".");// .表示当前目录
        // 文件路径名数组
        String list[] = path.list();
        
        // 对String文件名进行排序
        Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
        
        // 打印
        for(String dirItem : list)
            System.out.println(dirItem);
    }
}

右键run一下,可以得到如下的结果:

如图,很容易注意到了,其目录下的名字排序按字母并打印了。

先回顾下API知识吧, 首先构造函数 :File(String pathname)

  • 值为: file:///C:/Users/Jeff%20Lee/AppData/Local/Youdao/YNote/java/lang/String.html

  • 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。如果给定字符串是空字符串,那么结果是空抽象路径名。

  • 参数:pathname - 路径名字符串

如果 pathname 参数为 null抛出: NullPointerException

二者,File实现了Comparator接口,以便对FileName进行排序

String.CASE_INSENSITIVE_ORDER :是一个对 String 对象进行排序的 Comparator,作用与 compareToIgnoreCase 相同。

三者, path.list()为什么会返回String[]?filenams的数组呢?怎么不是List呢?

自问自答:这时候,我们应该去看看ArrayList的实现,ArrayList其实是动态的数组实现。动态,动态的弊端就是效率低。此时,返回一个固定的数组,而不是一个灵活的类容器,因为其目录元素是固定的。下面是ArrayList和数组Array的比较

二、深入 Java IO File 理解源码

File,File究竟是怎么构成的。顺着源码,知道了File有几个重要属性

  • 1、static private FileSystem fs FileSystem : 对本地文件系统的抽象
  • 2、String path 文件路径名
  • 3、内联枚举类 **PathStatus 地址是否合法 ENUM类 private static enum PathStatus { INVALID, CHECKED };
  • ** 4、prefixLength 前缀长度

如下,给出File相关核心的UML图

其实操作的是 FileSystem : 对本地文件系统的抽象,真正操作的是 FileSytem派生类。通过源码Ctrl+T发现如下:Win下操作的是 Win32FileSystemWinNTFileSystem类。看来真正通过jvm,native调用系统的File是他们。

Linux呢?因此,下了个Linux版本的JDK,解压,找到rt.jar。然后java/io目录中,找到了UnixFileSystem类。真相大白了!

所以可以小结File操作源码这样调用的:中间不同JDK,其实是不同的类调用本机native方法

三、File 方法详细使用案例

File 其实和我们在系统中看的的文件一样。就像我们右键,属性。可以看到很多File的信息。Java File也有。下面是一个文件的相关方法详情:

import java.io.File;

/*
 * File方法详细使用
 */
public class FileMethodsT {
    
    private static void fileData(File f) {
        System.out.println(
            " 绝对路径:" + f.getAbsolutePath() +
            "\\n 可读:" + f.canRead() +
            "\\n 可写:" + f.canWrite() +
            "\\n 文件名:" + f.getName() +
            "\\n 上级目录:" + f.getParent() +
            "\\n 相对地址:" + f.getPath() +
            "\\n 长度:" + f.length() +
            "\\n 最近修改时间:" + f.lastModified()
            );
        if(f.isFile())
            System.out.println(" 是一个文件");
        else if(f.isDirectory())
            System.out.println(" 是一个目录");
    }
    
    public static void main(String[] args) {
        // 获取src目录
        File file = new File("src");
        // file详细操作
        fileData(file);
    }
}

在eclipse中,右键run一下,可以得到如下的结果:大家应该都明白了吧。

文件如何过滤呢? 以后独立讲吧,过滤涉及Filter类。

四、小结

1、看源码很简单,看数据结构。看如何调用。或者是有些设计模式

2、学东西,学一点一点深一点。太深不好,一点就够了

3、学习的代码都在githubhttps://github.com/JeffLi1993/java-core-learning-example

🔥🔥 点击领取 ChatGPT Plus 正版账号
QRCode

本文由 泥瓦匠 创作

原创不易,欢迎关注公众号!转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!





本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。