2014-01-06 64 views
3

我已经将图像编码为xml文件,并且在解码时我遇到了长执行时间的问题(对于中等大小的图像,差不多20分钟),下面的代码显示了我现在如何转换xml到字符串,这是需要很长时间的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包含多个图像时问题更糟糕。

+0

...顺便说一句,你为什么要读取一个XML文件到一个字符串?只需将'InputStream'提供给解析器 - 如果你的intesion解析文档 - 不需要在'String'对象中包含内容。 – A4L

+0

其实我是一名学生,我被赋予了这样的任务。首先,我正在读取字符串,然后使用Base64解码字符串。 – DCoder

回答

5

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

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

这是好主意,利用现有的,这是更好的

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"); 
+0

这不会有任何影响。 JDK将把这个例子中的代码转换为基于StringBuilder的代码,检查生成的字节码。 – Mikhail

+0

我应该使用StringBuilder s2 =新的StringBuilder(inst.read()); – DCoder

+0

为什么不试试速度变化? –

1

StringBuilder解决方案在以前的回答表明,你可以尝试不同的方法,大大加快速度:

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