您的位置:首页 > 编程语言 > Java开发

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

2017-02-27 15:16 399 查看
一,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'?>"

            +"
cc02
<书><书名><书价格>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就可以了!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: