Spring資源抽象Resource
概述
Spring
對各種底層資源,比如檔案系統中的一個檔案,classpath上的一個檔案,或者一個網路URL,統一抽象為介面Resource
來表示 。
org.springframework.core.io // 介面Resource所在包
因為每個底層檔案都可以以一個只讀InputStream
的方式開啟,所以Resource
介面繼承自介面InputStreamSource
。InputStreamSource
介面中定義了方法getInputStream()
用於返回開啟該資源所對應的輸入流。
實現類
Spring
針對不同的底層資源型別提供了相應的實現。如下表所示 :
實現類 | 介紹 |
---|---|
ClassPathResource | Java類路徑上的一個資原始檔, 比如一個class檔案,xml/properties配置檔案,亦或一個圖片檔案等等 |
FileSystemResource | 作業系統檔案系統中的一個資原始檔 一個xml/properties配置檔案,一個圖片,一個pdf,一個jar包等等 |
UrlResource | 將一個網路URL地址封裝成一個資原始檔 一個靜態圖片,html,js,css,或者能動態生成json/xml |
ByteArrayResource | 將一個位元組陣列封裝成一個Resource |
ServletContextResource | 獲取ServletContext 環境下的資原始檔,在web應用程式的根目錄下解釋相對路徑 |
InputStreamResource | 將一個輸入流封裝成一個資源,因為用於描述一個已經開啟的資源,所以isOpen()總是返回true |
VfsResource | 針對JBoss VFS 的資源 |
使用例項
package test.resources;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.core.io.*;
import java.io.FileInputStream;
import java.io.InputStream;
@Slf4j
public class SpringResourceDemo {
/**
* 描述一個Resource例項
*
* @param resource
* @throws Exception
*/
void describe(Resource resource) throws Exception {
log.info("====================================");
log.info("toString : {}", resource.toString());
log.info("contentLength : {}", resource.contentLength());
log.info("exists : {}", resource.exists());
log.info("getDescription : {}", resource.getDescription());
log.info("isReadable : {}", resource.isReadable());
log.info("isOpen : {}", resource.isOpen());
log.info("getFilename : {}", resource.getFilename());
log.info("isFile : {}", resource.isFile());
if (resource.isFile()) {
// getFile()僅針對檔案型別Resource有效,可以是檔案系統檔案或者classpath上的檔案
log.info("getFile : {}", resource.getFile());
}
if (!((resource instanceof ByteArrayResource) || (resource instanceof InputStreamResource))) {
// 以下三個屬性針對 ByteArrayResource/InputStreamResource 型別資源無效,呼叫的話會丟擲異常
log.info("lastModified : {}", resource.lastModified());
log.info("getURI : {}", resource.getURI());
log.info("getURL : {}", resource.getURL());
}
}
@Test
public void test() throws Exception {
{
Resource resource = new ClassPathResource("test/resources/SpringResourceDemo.class");
describe(resource);
}
{// test.txt 是當前磁碟卷根目錄下一個存在的檔案,內容是:Test Spring Resource
Resource resource = new FileSystemResource("/test.txt");
describe(resource);
}
{//
Resource resource = new UrlResource("https://docs.spring.io");
describe(resource);
}
{//
Resource resource = new ByteArrayResource("Hello".getBytes());
describe(resource);
}
{// test.txt 是當前磁碟卷根目錄下一個存在的檔案,內容是:Test Spring Resource
InputStream is = new FileInputStream("/test.txt");
Resource resource = new InputStreamResource(is);
describe(resource);
}
}
}
上面的測試程式碼執行輸出如下:
====================================
toString : class path resource [test/resources/SpringResourceDemo.class]
contentLength : 2838
exists : true
getDescription : class path resource [test/resources/SpringResourceDemo.class]
isReadable : true
isOpen : false
getFilename : SpringResourceDemo.class
isFile : true
getFile : D:\springboot-tut-zero\target\test-classes\test\resources\SpringResourceDemo.class
lastModified : 1542634668385
getURI : file:/D:/springboot-tut-zero/target/test-classes/test/resources/SpringResourceDemo.class
getURL : file:/D:/springboot-tut-zero/target/test-classes/test/resources/SpringResourceDemo.class
====================================
toString : file [D:\test.txt]
contentLength : 20
exists : true
getDescription : file [D:\test.txt]
isReadable : true
isOpen : false
getFilename : test.txt
isFile : true
getFile : \test.txt
lastModified : 1542633020067
getURI : file:/D:/test.txt
getURL : file:/D:/test.txt
====================================
toString : URL [https://docs.spring.io]
contentLength : -1
exists : true
getDescription : URL [https://docs.spring.io]
isReadable : true
isOpen : false
getFilename :
isFile : false
lastModified : 0
getURI : https://docs.spring.io
getURL : https://docs.spring.io
====================================
toString : Byte array resource [resource loaded from byte array]
contentLength : 5
exists : true
getDescription : Byte array resource [resource loaded from byte array]
isReadable : true
isOpen : false
getFilename : null
isFile : false
====================================
toString : InputStream resource [resource loaded through InputStream]
contentLength : 20
exists : true
getDescription : InputStream resource [resource loaded through InputStream]
isReadable : true
isOpen : true
getFilename : null
isFile : false