从XML文件中读取需要很长时间

时间:2014-01-06 12:01:58

标签: java file-io iostream decode decoding

我已经将图像编码到xml文件中,在解码时我遇到了执行时间长的问题(对于中等大小的图像几乎是20分钟),下面的代码显示了我现在如何将xml转换为字符串,这需要很长时间xml有大图像的时间,是否可以在更短的时间内将xml转换为字符串。

String s1= new String();
System.out.println("Reading From XML file:");
    InputStream inst = new FileInputStream("c:/collection.xml");
    long size = inst.available();
        for(long i=0;i<size;i++)
        {
            s1=s1+ (char)inst.read();

        }
    inst.close();

当我的xml包含多个图像时问题更严重。

3 个答案:

答案 0 :(得分:5)

使用StringBuilder而不是String s1。字符串连接s1=s1+ (char)inst.read();是问题所在。

需要修复的另一件事 - 使用BufferedInputStream,因为从FileInputStream逐字节读取效率非常低。

使用available是个坏主意,这是更好的

for(int i; (i = inst.read()) != -1;) {
    ...
}
总而言之

    StringBuilder sb= new StringBuilder();
    try (InputStream inst = new BufferedInputStream(new FileInputStream("c:/collection.xml"))) {
        for(int i; (i = inst.read()) != -1;) {
            sb.append((char)i);
        }
    }
    String s = sb.toString();

如果文件足够小以适应内存,那么

    File file = new File("c:/collection.xml");
    byte[] buf = new byte[(int)file.length()];
    try (InputStream in = new FileInputStream(file)) {
        in.read(buf);
    }
    String s = new String(buf, "ISO-8859-1");

答案 1 :(得分:2)

第1次

String s1= new String();

是无用的,因为String是不可变的,并且为每个循环迭代分配一个新对象(连接的结果)。

2,使用StringBuilder使用循环

构建String

3,使用InputStream#read(byte[])InputStream#read(byte[], int, int)使用字节缓冲区读取,逐字节读取速度要快得多。

答案 2 :(得分:1)

除了之前回答中建议的StringBuilder解决方案之外,您可以尝试不同的方法来大幅提升速度:

  1. 使用BufferedInputStream
  2. 您知道文件大小。您可以使用java.io.Reader.read(char[] buf)方法分配文件大小的char缓冲区并将整个文件内容融入其中。关注大文件;诋毁巨大的文件可能会让你遇到OutOfMemoryException。
  3. 使用XML解析器加载XML内容。他们知道如何有效地读取文件(哦,依赖于实现;比你在任何情况下使用的逻辑更好)。关注DOM解析器;如果文件很大,它们可能会使您遇到OutOfMemoryException。您可能希望使用SAX解析器来获取正在读取的每个图像内容的事件,以便您可以一次处理一个。