一,Resource接口,以及它的相关的类,方法
spring强大的访问资源功能来源于-------->Resource接口
Resource接口有四个类(一般该四类是单独执行的不需要实现Resource接口)
1.ClasspathResource:访问src包下(称为类路径)的文件
2.filesystemResource:访问同个包下的文件
3.URLResource:访问网络文件
4.ByteArrayResource:访问字节数组文件
5.inputStreamResource:访问输入流文件
6.ServletContextResource:访问相对于ServletContext路径里的文件
另外它还有六大方法
1.getinputstram():定位打开文件
2.exists():判断文件是否存在
3.ioOpen:判断文件是否正在访问
4.getDescription()返回文件描述信息
5.getfile:返回文件对应的file对象
6.geturl:返回文件对应的url对象
二,以classpathResource和ByteArrayResource作为例子,写出代码
classpathResource读取src类路径下的文件:
package test;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class test_resource {
public static void main(String[] args) throws Exception, IOException {
ClassPathResource res=new ClassPathResource("MyXml1.xml");
System.out.println(res.getFilename());
System.out.println(res.getDescription());
//这里就已经结束了一个classpathResource读取src包资源的例子,但是为了给大家展示出整个xml文件信息,
// 我们在这里添加了xml的dom4j解析方法来遍历src包文件里面所有的标签信息
//以下是dom4j--->saxreader遍历解析方法
SAXReader reader=new SAXReader();
Document doc = reader.read(res.getFile());
Element el = doc.getRootElement();
List l = el.elements();
for(Iterator it=l.iterator();it.hasNext();){
Element book = (Element) it.next();
List ll = book.elements();
for(Iterator it2=ll.iterator();it2.hasNext();){
Element eee = (Element) it2.next();
System.out.println(eee.getText());
}
}
}
}
src下的资源文件---->MyXml1.xml
<?xml version="1.0" encoding="utf-8"?>
<计算机书籍列表>
<书>
<书名>bbox教程</书名>
</书>
</计算机书籍列表>
输出结果:
ByteArrayResource输出字节流方式,
package test;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.core.io.ByteArrayResource;
public class test_bytearray {
public static void main(String[] args) throws Exception, IOException {
String file="<?xml version='1.0' encoding='gbk'?>"
+"<书><书名><书价格>3.14元</书价格><书作者>林先生</书作者></书名></书>";
byte[] file1 = file.getBytes();
ByteArrayResource bar = new ByteArrayResource(file1);
System.out.println(bar.getDescription());
SAXReader reader=new SAXReader();
Document doc = reader.read(bar.getInputStream());
Element el = doc.getRootElement();
List l = el.elements();
for(Iterator it=l.iterator();it.hasNext();){
Element book = (Element) it.next();
List ll = book.elements();
for(Iterator it2=ll.iterator();it2.hasNext();){
Element eee = (Element) it2.next();
System.out.println(eee.getText());
}
}
}
}
输出结果:
该方法是没有配置文件,因为配置文件由类它自己提供,然后用ByteArrayResource进行输出,也就是说它不是一种读取方式,而是一种输出方式.
以上执行这两种方法的时候,我遇到的一些问题:
1.可以读取xml文件,但是无法使用saxreader来遍历xml标签内容
2.ByteArrayResource输出内容时候遇到-------------->2 字节的 UTF-8 序列的字节 2 无效。 Nested exception: 2 字节的 UTF-8 序列的字节 2 无效 的异常
以下便是解答
1.可以读取xml文件,就说明并不是saxreader解析器的问题,也不是resource接口中 classpathResource类的问题,而是xml文件本身书写错误
我一开始书写xml 是这种的
<书>
<书名>bbox教程</书名>
<书>
这种书写是不正确的,xml应该要有三个标签,一个根标签,一个内容标签,一个属性标签(其中属性标签属于内容标签,内容标签属于根标签)如
<书籍列表>
<书>
<书名>bbox教程</书名>
</书>
</书籍列表>
这样就可以解决问题了
2.这种问题是说明申明问题即-----><?xml version="1.0" encoding="utf-8"?>该处申明失败,而异常指向utf-8说明是编码方式出现问题
那么我们就修改编码方式,我使用的IDE是MyEcilpse 它默认下采用gbk编码方式 而此处与utf-8有所冲突
所以在project--->properties----->resource----->text file encoding---->other 改为utf-8就可以了!