java 使用 FileInputStream 读取 xml 文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7151586/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
reading xml file using FileInputStream
提问by bhalkian
I am reading an XML
file using the code given below, but every time I read the XML
and print the same, the opening tag of XML
is always missing, which in turn generates an error.
我正在XML
使用下面给出的代码读取文件,但是每次我读取XML
并打印相同的文件时,XML
总是缺少的开始标记,从而产生错误。
code to read xml :
读取xml的代码:
package com.vaannila.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.vaannila.FormBean.XmlRetrivalForm;
public class AppletRefeshAction extends Action {
String filepath = "C:/Users/ashutosh_k/idoc/docRuleTool/WebContent/data/Malaria.xml";
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
XmlRetrivalForm xrf = (XmlRetrivalForm)form;
String dieasename =xrf.getDieseasename();
System.out.println("ghhjhhjkh"+dieasename);
/* this part of the code is from jsp */
//FileReader fis = new FileReader(new File(filepath));
FileInputStream fis = new FileInputStream(new File(filepath));
byte bin[] = new byte[(int) new File(filepath).length()];
while(fis.read()>0){
fis.read(bin);
}
System.out.println("I am here after reading the xml part of it ");
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
response.getOutputStream().write(bin);
// response.getWriter().write(bin);
String ashu = new String(bin);
String iam =ashu.trim();
System.out.println("i am in the new action class now ");
System.out.println(iam);
fis.close();
/* this part of the code jsp ends here */
return null;
}
}
The output xml generated :
生成的输出xml:
?xml version="1.0" encoding="UTF-8" standalone="no"?><tree>
<declarations>
<attributeDecl name="name" type="String"/>
</declarations>
<branch>
<branch>
<attribute name="name" value="Excess Stool"/>
<branch>
<branch>
<attribute name="name" value="Do you have this condition for more than a weeks time"/>
<branch>
<attribute name="name" value=""/></branch>
<branch>
<attribute name="name" value=""/></branch>
</branch>
<branch>
<attribute name="name" value="No"/></branch>
<attribute name="name" value="Do you have watery stool"/></branch>
<branch>
<attribute name="name" value="No"/></branch>
</branch>
<branch>
<branch>
<attribute name="name" value="Was your peak temperature greater than 104"/>
<branch>
<branch>
<attribute name="name" value="Do you have chills"/>
</branch>
<branch>
<attribute name="name" value="No"/></branch>
<attribute name="name" value="Do you have high fever for more than a weeks time "/></branch>
<branch>
<attribute name="name" value="No"/></branch>
</branch>
<branch>
<attribute name="name" value="No"/></branch>
<attribute name="name" value="High Fever"/></branch>
<branch>
<branch>
<attribute name="name" value="Do you have pain in the left part of the head "/>
<branch>
<branch>
<attribute name="name" value="Duration of the headache spans for more than a day "/>
</branch>
<branch>
<attribute name="name" value="No"/></branch>
<attribute name="name" value="Do you have headache more than 5 times a day "/></branch>
<branch>
<attribute name="name" value="No"/></branch>
</branch>
<branch>
<attribute name="name" value="No"/></branch>
<attribute name="name" value="Bodyache"/></branch>
<attribute name="name" value="Malaria"/></branch>
</tree>
回答by Mike Thomsen
Why this?
为什么这个?
FileInputStream fis = new FileInputStream(new File(filepath));
byte bin[] = new byte[(int) new File(filepath).length()];
while(fis.read()>0){
fis.read(bin);
}
instead of this to read the text?
而不是这个来阅读文本?
BufferedReader reader = new BufferedReader(new FileReader(filepath));
String line = null;
StringBuilder builder = new StringBuilder();
while ( (line = reader.readLine()) != null)
builder.append(line);
reader.close();
回答by forty-two
First, you are reading into the byte buffer at the same offset in every loop iteration--you cannot expect to always read the entire file in one go. Second, don't unnecessarily convert between byte streams and character streams--you should read the XML as bytes and "forward" it as bytes. Be careful how you convert between byte arrays and strings--remember that new String(byte[])
uses the platform default character encoding (which may not be utf-8) to convert from bytes to characters.
首先,您在每次循环迭代中都以相同的偏移量读入字节缓冲区——您不能期望总是一次性读取整个文件。其次,不要在字节流和字符流之间进行不必要的转换——您应该将 XML 读取为字节并将其“转发”为字节。请注意如何在字节数组和字符串之间进行转换——请记住,newString(byte[])
使用平台默认字符编码(可能不是 utf-8)将字节转换为字符。
// read the file
ByteArrayOutputStream out = new ByteArrayOutputStream(10000);
InputStream in = new BufferedInputStream(new FileInputStream(filepath));
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
// debug as string
if (debug) {
System.out.writeln(new String(out.toBytes(), Charset.forName("utf-8"));
}
// forward to client through response
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
response.getOutputStream().write(out.toBytes());