本人用JBoss部署了一个Struts构架的Web应用,在里面的Action中调用JDom来解释一个中文名的XML文件.
部署正常后,通过浏览器访问出错,提示:java.io.FileNotFoundException.
于是我在Action里面直接写main函数,并运行相关的代码,并没有出错.
请各位高手解释一下:
代码如下:
public class InstallTaskAction extends Action {
    
    ....
    File toDir = new File("d:\\asdf\\zxcv\\");
    File[] xmlFiles = toDir.listFiles(); //里面的xml文件都是中文命名
    for(int i = 0; i < xmlFiles.length; i++){
        parseTesterInfoXML(xmlFiles[i]); //在JBoss中运行错误,提示FileNotFoundException
    }
    ...    private ArrayList parseTesterInfoXML(File file){
        ...
        builder = factory.newDocumentBuilder();
        doc = builder.parse(file); //出错位置
        doc.normalize();
        ...
    }    public static void main(String[] args){
        InstallTaskAction test = new InstallTaskAction();
        test.parseTesterInfoXML(new File("d:\\asdf\\zxcv\\详细数据.xml")); //却又能正常解释????
    }

解决方案 »

  1.   

    你的"d:\asdf\zxcv\"目录是否全是.xml文件?如果有子目录,肯定会错
    另外,还用try...catch试一下是那个个文件出错,将它的文件名打出来;
     
      

  2.   

    我的"d:\asdf\zxcv\"没有子目录,里面就一个xml文件,名字为"详细数据.xml"
        ...
        File toDir = new File("d:\\asdf\\zxcv\\");
        File[] xmlFiles = toDir.listFiles(); //里面的xml文件都是中文命名
        for(int i = 0; i < xmlFiles.length; i++){
            System.out.println(xmlFiles[i].getName()); //打印是正确的中文名!
            parseTesterInfoXML(xmlFiles[i]); //在JBoss中运行错误,提示FileNotFoundException
        }
        ...
      

  3.   

    刚才发现一个新的问题:
    就是我在Action中写下一下代码,然后在JBoss中运行提示出错:
    parseTesterInfoXML(new File("d:\\asdf\\zxcv\\详细数据.xml")); //我直接写xml的绝对路径
    说:
    java.io.FileNotFoundException: d:\asdf\zxcv\E6%B8%85%E7%9B%9B%E5%9F%BE6%B8%85%E7.xml但是我把上上面的代码在置于main()函数中,直接当作应用程序运行,则运行正常奇怪??
    为什么同一段代码,一个在JDK环境中运行就正常,一个在容器中运行就出错?????
    请CSDN上面的高手解释解释
      

  4.   

    那就是JBoss对中文的支持问题了.
    其实很多国外软件对中文支持还是问题多多
      

  5.   

    我在JBoss下面加了一个字符Filter
    是不是这个导致的??
    <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>cn.com.detech.teachplatform.comm.SetCharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GB2312</param-value>
    </init-param>
    <init-param>
    <param-name>ignore</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
    </filter-mapping>
      

  6.   

    一个提示:File toDir = new File("d:\\asdf\\zxcv\\");
        File[] xmlFiles = toDir.listFiles(); //里面的xml文件都是中文命名
        for(int i = 0; i < xmlFiles.length; i++){
            System.out.println(xmlFiles[i].getName()); //打印是正确的中文名!        String s = xmlFiles[i].getName();
            s = new String(s.getByte(),"ISO8859-1");
            File f = new File(s);        parseTesterInfoXML(f);//在JBoss中运行错误,提示FileNotFoundException
    另外如果英文文件名称OK的话,就用英文名称,你知道大部分字符串的编码都是"ISO8859-1"或者"UTF-8"的,所以不要总用中文名称。
      

  7.   

    你看一下你的xml文件的 encoding是否为gb2312,我遇到过,改为gb2312就解析正常了
      

  8.   

    好象是因为文件名的问题
    建议对文件名进行正确的编码,具体用哪个方法记不清了,可以在网上找找,不会是因为xml或者xml 解析的问题
      

  9.   

    问题解决了
    主要是由于File对象对应的是一个String的字符串,有相应的编码.
    我是如下解决的:
    InputStream is = new FileInputStream("d:\\asdf\\zxcv\\阿瑟多幅.xml");
    获取一个输入流
    然后把这个输入流传入JDom中解释即可
    解释完毕后关闭流
    因为在
        private ArrayList parseTesterInfoXML(File file){
            ...
            builder = factory.newDocumentBuilder();
            doc = builder.parse(file); //出错位置
            doc.normalize();
            ...
        }
    中,builder.parse()方法可以解释InputStream对象作为参数