我已经将图像编码到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包含多个图像时问题更严重。
答案 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使用循环
构建String3,使用InputStream#read(byte[])或InputStream#read(byte[], int, int)使用字节缓冲区读取,逐字节读取速度要快得多。
答案 2 :(得分:1)
除了之前回答中建议的StringBuilder
解决方案之外,您可以尝试不同的方法来大幅提升速度:
BufferedInputStream
。java.io.Reader.read(char[] buf)
方法分配文件大小的char缓冲区并将整个文件内容融入其中。关注大文件;诋毁巨大的文件可能会让你遇到OutOfMemoryException。