spring访问本地资源技术------>Resource接口(及saxreader遇到的异常情况)

来源:互联网 发布:阿里云 挂载数据盘 编辑:程序博客网 时间:2024/05/22 16:02

一,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就可以了!





1 0
原创粉丝点击