FileSystemResource 和 ClassPathResource 是 java 中比較常見的兩個獲取資源的類。除了他們兩個之外,還有一個也比較常用。那就是 ServletContextResource。本文介紹他們三個的用法。
FileSystemResource 是 Spring 提供的資源訪問類。FileSystemResource 類相比其他兩個資源訪問類,沒有什么優勢,它只是在 File 類的基礎上略作封裝。
/*默認從文件系統的當前路徑加載xttblog.xml資源*/ FileSystemResource fsr = new FileSystemResource("xttblog.xml");
FileSystemResource 實例可使用 FileSystemResource 構造器顯示地創建,但更多的時候它都是隱式創建。執行 Spring 的某個方法時,該方法接受一個代表資源路徑的字符串參數,當 Spring 識別該字符串參數中包含file:前綴后,系統將會自動創建FileSystemResource 對象。
ClassPathResource 也是 Spring 框架提供的類。利用ClassPathResource讀取xml配置的基本思路就是通過構造函數傳入的文件路徑,接着交給class或者classLoader,調用getResourceAsStream獲取到InputStream。
FileSystemResource 和 ClassPathResource 的用法如下:
String filePath = "D:/com/xttblog.txt"; //使用系統文件路徑方式加載文件 Resource res1 = new FileSystemResource(filePath); //使用類路徑方式加載文件 Resource res2 = new ClassPathResource("conf/xttblog.txt"); InputStream ins1 = res1.getInputStream(); InputStream ins2 = res2.getInputStream(); getFileName();//獲取文件名 getFile();//獲取資源對應的File對象 getInputStream();//獲取文件的輸入流 createRelative(String relativePath);//在相對地址創建新文件 EncodedResource encRes = new EncodedResource(res, "UTF-8"); String content = FileCopyUtils.copyToString(encRes.getReader()); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource resources[] = resolver.getResources("classpath*://com/***/*.xml"); For(Resource resource : resources){ System.out.println(resource.getDescription); }
ClassPathResource、 FileSystemResource、InputStreamResource、ServletContextResource、 UrlResource 的區別如下:
- ClassPathResource 從系統的類路徑中加載
- FileSystemResource 從文件系統加載,比如說自己指定配置文件的全路徑
- InputStreamResource 從輸入流中加載
- ServletContextResource 從Servlet 上下文環境中加載
- UrlResource 從指定的Url加載
Class.getResource("")獲取的是相對於當前類的相對路徑。Class.getResource("/")獲取的是classpath的根路徑。ClassLoader.getResource("")獲取的是classpath的根路徑。
在創建ClassPathResource對象時,我們可以指定是按Class的相對路徑獲取文件還是按ClassLoader來獲取。
FileSystemResource 效果類似於Java中的File
ClassPathResource 效果類似於this.getClass().getResource("/").getPath();
ServletContextResource 效果類似於request.getServletContext().getRealPath("");
