【问题标题】:Reading from XML file taking very long time从 XML 文件读取需要很长时间
【发布时间】:2014-01-23 20:03:49
【问题描述】:

我已将图像编码为 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 包含多个图像时,问题会更严重。

【问题讨论】:

  • ...顺便说一句,您为什么要将 xml 文件读入字符串?只需将 InputStream 提供给您的解析器 - 如果您的意图是解析文档 - 则无需将内容包含在 String 对象中。
  • 其实我是一名学生,我被分配了这样的任务。首先我正在读取字符串,然后使用 Base64 解码字符串。

标签: java file-io iostream decode decoding


【解决方案1】:

使用 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");

【讨论】:

  • 那不会有任何影响。 JDK 会将本示例中的代码转换为基于 StringBuilder 的代码,检查生成的字节码。
  • 我应该使用 StringBuilder s2 = new StringBuilder(inst.read());
  • 为什么不试试变速?
  • StringBuilder s1 = new StringBuilder(); (而不是 String s1 = new String)和 s1.append((char)inst.read());
  • Evgeniy Dorofeev 我试过了,但它不起作用。执行上述命令 s1 后,我已在调试模式下进行检查,不包含任何数据。
【解决方案2】:

第一个

String s1= new String();

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

第二,使用StringBuilder 使用循环构建字符串

第三,使用InputStream#read(byte[])InputStream#read(byte[], int, int)使用字节缓冲区读取,这比逐字节读取要快得多。

【讨论】:

    【解决方案3】:

    除了上一个答案中建议的StringBuilder 解决方案外,您可以尝试不同的方法来显着加快速度:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多