本人用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")); //却又能正常解释????
}
部署正常后,通过浏览器访问出错,提示: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")); //却又能正常解释????
}
另外,还用try...catch试一下是那个个文件出错,将它的文件名打出来;
...
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
}
...
就是我在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上面的高手解释解释
其实很多国外软件对中文支持还是问题多多
是不是这个导致的??
<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>
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"的,所以不要总用中文名称。
建议对文件名进行正确的编码,具体用哪个方法记不清了,可以在网上找找,不会是因为xml或者xml 解析的问题
主要是由于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对象作为参数