2015年12月14日 星期一

Resource 與 Wildcard (通配符) (Spring3.x 二)

官方文件
就是讀取檔案、圖片…等
假設D槽有個abc.txt,內容是
abc
def
ghi



Resource rs1 = new FileSystemResource(new File("D:/abc.txt"));
System.out.println(rs1.contentLength() + " Byte");// 13 Byte
System.out.println(rs1.getDescription());// file [D:\abc.txt]
System.out.println(rs1.getFilename());// abc.txt
System.out.println(rs1.getFile());// D:\abc.txt
System.out.println(rs1.getInputStream());

Resource rs2 = new ClassPathResource("generalFile/abc.txt");// workspace\SpringDemo(專案名稱)\target\classes下的路徑
System.out.println(rs2.getDescription());// class path resource [generalFile/abc.txt]
System.out.println(rs2.getFile());// D:\xxx\xxx\xxx\abc.txt

Resource rs3 = new FileSystemResource(new File("D:/chi.txt"));
// 只用java
InputStream in = rs3.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "BIG5"));
String temp = null;
while ((temp = br.readLine()) != null) {
    System.out.println(temp);
}
br.close();
    
// Spring提供的方法
System.out.println(Charset.defaultCharset());
EncodedResource er = new EncodedResource(rs3, Charset.forName("BIG5"));
System.out.println(FileCopyUtils.copyToString(er.getReader()));

※FileSystemResource也可以直接塞String,裡面放路徑也是可以
※檔案編碼是Big5,而a~i有9個Byte,然後還有兩個Enter,一個Enter有2個Byte,所以是13 Byte,可以看證明unicode和UTF-8各佔幾Byte
※rs2的檔案我放在叫「generalFile」的package下
※編碼要和檔案的編碼對應才不會出亂碼
※Charset.defaultCharset()是JVM的編碼,可以印出來看看合不合用



※通配符

※classpath:或classpath:/
上面rs2的「ClassPathResource」兩種都可以
Resource rs2 = new ClassPathResource("generalFile/abc.txt");
Resource rs2 = new ClassPathResource("/generalFile/abc.txt");


※file:或file:/
上面rs3的「FileSystemResource」兩種都可以,可用絕對和相對路徑
Resource rs3 = new FileSystemResource(new File("D:/chi.txt"));
Resource rs3 = new FileSystemResource(new File("/D:/chi.txt"));

※http://
Resource xxx = ctx.getResource("http://xxx/ooo/ooo.txt");


※ftp://
Resource xxx = ctx.getResource("ftp://ooo/xxx/xxx.txt");


※前面什麼都沒有就是使用ApplicationContext了
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");


※*
和Windows一樣,匹配0~多個字元

※?
和Windows一樣,配配1個字元

※**
匹配多層
classpath:abc/def/**/*.xml-->就是匹配abc/def底下,不管幾層資料夾下的檔案,而且結尾是xml
file:D:/abc/t?st.xml-->D:\abc下的t什麼st.xml的檔案,如test.xml、tpst.xml、tzst.xml…等

※classpath和classpath*
假設有多個jar檔,包名都是abc.def
classpath:abc/def/module*.xml-->只會抓一個jar檔裡面的所有module*.xml檔
classpath*:abc/def/module*.xml-->全部的jar檔裡面的所有module*.xml檔都會抓


可用在Resource和ApplicationContext
Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("file:/some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("http://myhost.com/resource/path/myTemplate.txt");
    
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");


也可用在xml
<property name="template" value="classpath:some/resource/path/myTemplate.txt">
<property name="template" value="file:/some/resource/path/myTemplate.txt"/>


依照這樣的說法,可以將上面的程式改成下面的樣子
FileSystemXmlApplicationContext ctx1 = new FileSystemXmlApplicationContext();
ClassPathXmlApplicationContext ctx2 = new ClassPathXmlApplicationContext();
    
Resource rs1 = ctx1.getResource("file:/D:/abc.txt");
Resource rs2 = ctx2.getResource("classpath:/generalFile/abc.txt");
    
System.out.println(rs1.contentLength() + " Byte");// 13 Byte
System.out.println(rs1.getDescription());// file [D:\abc.txt]
System.out.println(rs1.getFilename());// abc.txt
System.out.println(rs1.getFile());// D:\abc.txt
System.out.println(rs1.getInputStream());
    
System.out.println(rs2.getDescription());// class path resource [generalFile/abc.txt]
System.out.println(rs2.getFile());// D:\xxx\xxx\xxx\abc.txt
    
ctx1.close();
ctx2.close();

※如果用多型的寫法ApplicationContext ctx1 = new FileSystemXmlApplicationContext();
會出現警告 Resource leak: 'ctx1' is never closed,但沒有close()方法,可以用
((FileSystemXmlApplicationContext)ctx1).close();,這樣就不會有警告了

還可以一次load進好幾個檔案
ApplicationContext ctx1 = new FileSystemXmlApplicationContext(new String[]{"xxx.xml", "ooo.xml"});
ClassPathXmlApplicationContext ctx2 = new ClassPathXmlApplicationContext(new String[]{"xxx.xml", "ooo.xml"});

沒有留言:

張貼留言