file:// 表示从一个 URL 中读取,它可以是http,ftp,file甚至是你自定义的协议(需要实现相应的URLStreamHandler),而使用classpath则是表示使用classloader.getResourceAsStream(),这是跨平台的选择,当然相应的类路径也可以使用前面提到的url,只是这要求你必须把那个url添加到类路径上,有时你可能没有这个权限去改命令行对应的bat 和 sh 文件,却有权限改你的配置目录。它们各有用处。假设你想用一个URL,管理员却不给你权限改脚本文件,如何是好。
像 file 协议在unix 和 windows 当文件路径的写法不同,而classpath 协议则把这个事件交给管理员(部署程序的人),跟程序本身没关系,所以实现了“一次编译,到处运行”的跨平台期望。
像你这个 ${user.dir} 已经用了 System.getProperties() 中的变量,这也能避开操作系统写法上的不同,类似 classpath。只是如果你是直接把文件全路径写出来时在两个操作系统上就有不同写法,如果这个写法的不同发生在代码本身就表示它仅能运行在指定的平台上,这就是限制。