一、概述
classpath:编译后的.class文件、.xml、properties等资源文件所在的路径。
获取资源路径最重要的两发方法:
1. getResource()
方法:getResource(String name)
参数:如果以"/"开头则在classpath根路径下获取,否则就在此类所在的包下获取资源,该方法不会递归子目录。
用途:获取资源文件的路径。
说明:
linux没有盘符的概念,取而代之的是根路径,因此要想使用跨系统获取绝对路径,就需要使用Class类提供的getResource()方法。
与此类似的还有Class.getResourceAsStream()方法,在使用时,路径选择上是一样的,只不过返回的是流,方便封装 工具类处理。
如果需要以类为相对路径查找资源, 则应该调用Class.getResource()方法。
2.getClassLoader()
用途: 获取类对象的加载器。
说明:
getClassLoader()是获得这个类对象的加载器。只有Class类才有getClassLoader()方法。
如果需要以库为相对路径来查找资源, 此时则应该调用ClassLoader.getResource()方法。
类加载机制:
java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。ClassLoader的具体作用就是将class文件
加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。
类加载器:
3. 文件操作
commons-io是Apache提供的操作io的第三方工具,里面封装了很多处理io流和文件的方法,可以大大的简化我们处理
io流和操作文件的代码。commons-io主要分为工具类、尾端列、迭代器、文件过滤器等。
3.1 工具类
工具类包括FileUtils、IOUtils、FilenameUtils和FileSystemUtils,前三者的方法并没有太大的区别,只是操作的对象不同。
顾名思义,FileUtils主要操作File类,IOUtils主要操作IO流,FilenameUtils则是操作文件名,FileSystemUtils包含了一些JDK
没有提供的用于访问文件系统的实用方法。当前,只有一个用于读取硬盘剩余空间的方法可用。、
3.2 尾端类
不同的计算机体系结构使用不同约定的字节排序。在所谓的“低位优先”体系结构中(如Intel),低位字节处于内存中最低位置,
而其后的字节,则处于更高的位置。在“高位优先”的体系结构中(如Motorola),这种情况恰恰相反。
这个类库上有两个相关类:
EndianUtils包含用于交换java原对象和流之间的字节序列。
SwappedDataInputStream类是DataInput接口的一个实例。使用它,可以读取非本地的字节序列。
3.3 迭代器类
LineIterator类提供了一个灵活的方式与基于行的文件交互。可以直接创建一个实例,或者使用FileUtils或IOUtils的工厂方法来创建。
3.4 文件过滤器
org.apache.commons.io.filefilter包定义了一个合并了java.io.FileFilter以及java.io.FilenameFilter的接口(IOFileFilter)。除此之外,
这个包还提供了一系列直接可用的IOFileFilter的实现类,可以通过他们合并其它的文件过滤器。
比如,这些文件过滤器可以在列出文件时使用或者在使用文件对话框时使用。
二、使用
1. 获取资源路径
package file; import me.zhengjie.utils.FileUtil; import java.io.File; import java.net.URL; /** * @author zls * @date 2020/3/21 */ public class FileUtils { public static void main(String[] args) throws Exception { // getClassLoader() getRootPath1(); // getResource() getCurrentClsPath(); getRootPath(); } /** * 3.通过类加载器获取 * path不能以’/'开头时,path是从ClassPath根下获取。 * */ public static void getRootPath1() throws Exception { String rootpath1 = FileUtils.class.getClassLoader().getResource("").getPath(); // eg: /E:/idea2021/eladmin/eladmin-system/target/test-classes/ System.out.println("rootpath1 = " + rootpath1); // 获取根路径下的girls.xml资源文件 String girlsPath = FileUtil.class.getClassLoader().getResource("girls.xml").getPath(); // /E:/idea2021/eladmin/eladmin-system/target/test-classes/girls.xml System.out.println("girlsPath = " + girlsPath); } /** * 2.获取到的是当前.class所在包的路径 * path不以’/'开头时,默认是从此类所在的包下取资源 */ public static void getCurrentClsPath() throws Exception { String currentClsPath = FileUtils.class.getResource("").getPath(); // eg: /E:/idea2021/eladmin/eladmin-system/target/test-classes/file/ System.out.println("currentClsPath = " + currentClsPath); // 当前包下查找fileTest.xml文件 String filePath = FileUtils.class.getResource("A.class").getPath(); // eg: /E:/idea2021/eladmin/eladmin-system/target/test-classes/file/A.class System.out.println("filePath = " + filePath); } /** * 1.获取到的是根路径 * path 以’/'开头时,则是从ClassPath根下获取; */ public static void getRootPath() throws Exception { String rootPath = FileUtils.class.getResource("/").getPath(); // eg: /E:/idea2021/eladmin/eladmin-system/target/test-classes/ System.out.println("rootPath = " + rootPath); // 查找根路径下的girls.xml文件 String girlsPath = FileUtils.class.getResource("/girls.xml").getPath(); // eg: /E:/idea2021/eladmin/eladmin-system/target/test-classes/girls.xml System.out.println("girlsPath = " + girlsPath); } }
2. commons-io文件操作
package file; import org.apache.commons.io.FileUtils; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.IOException; /** * apache工具包commons-io操作文件测试 * * 参考:https://www.cnblogs.com/liuligang/articles/9548318.html * @author zls * @date 2020/3/22 */ public class CommosIoTest { private final static String basePath = "E:/test/"; public static void main(String[] args) throws Exception { copyFile(); } /** * 文件复制 * @throws IOException */ public static void copyFile() throws IOException { FileUtils.copyFile(new File(basePath+"a.txt"), new File(basePath+"/backup/a.txt")); } }
参考: