Android内存不足异常,而HTML正在删除字符串
我必须对大小为~1,4MB的字符串(HTML转义XML文件(因此字符串中的所有val都是<;TAG>;val<;/TAG>;等等)进行HTML取消转义,以便在解析器中使用未转义的XML) 我遇到的问题是,在使用StringEscapeUtils.unescapeHtml(String)(apache-commons-lang-2.6库)时,当我尝试获取未转义字符串时,总是会出现内存不足异常 我还尝试了基本android api的方法来取消对字符串的scape,但是除了速度非常慢之外,内存不足异常甚至在较小的字符串(~700kb)中也会发生Android内存不足异常,而HTML正在删除字符串,android,memory-management,out-of-memory,Android,Memory Management,Out Of Memory,我必须对大小为~1,4MB的字符串(HTML转义XML文件(因此字符串中的所有val都是<;TAG>;val<;/TAG>;等等)进行HTML取消转义,以便在解析器中使用未转义的XML) 我遇到的问题是,在使用StringEscapeUtils.unescapeHtml(String)(apache-commons-lang-2.6库)时,当我尝试获取未转义字符串时,总是会出现内存不足异常 我还尝试了基本android api的方法来取消对字符串的scape,但是除了速度非常慢之
有人能告诉我如何处理这样的字符串转换而不出现内存不足异常吗?Java有一些很好的核心功能,可以让这项工作变得非常简单。 下面的解决方案使用正则表达式遍历内容,并允许您替换字符。这个解决方案确实需要做一些工作,因为您需要提供转义码。你可以在这里找到转义码列表[http://www.w3.org/TR/html4/sgml/entities.html][1] 或者为其他人搜索网络 代码如下:
import java.util.regex.*;
import java.util.*;
public class HtmlUnescape {
public static void main(String[] args){
HashMap<String,String> codes = new HashMap<String,String>();
codes.put("<", "<");
codes.put(">", ">");
codes.put(""", "\"");
String html = "<html><head><title>Hello</title></head><body><h1>The great escape "example"</h1></body></html>";
Matcher matcher = Pattern.compile("&#*\\w\\w\\w?\\w?;").matcher(html);
StringBuffer matchBuffer = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(matchBuffer, codes.get(matcher.group()));
}
matcher.appendTail(matchBuffer);
System.out.println (matchBuffer.toString());
}
}
import java.util.regex.*;
导入java.util.*;
公共类逃逸{
公共静态void main(字符串[]args){
HashMap代码=新的HashMap();
代码。放置(“,”);
代码。放置(";,“\”);
String html=“htmlheadtitlehlello/title/headbodyh1大逃亡";示例";/h1/body/html”;
Matcher Matcher=Pattern.compile(*\\w\\w\\w?\\w?).Matcher(html);
StringBuffer matchBuffer=新的StringBuffer();
while(matcher.find()){
appendReplacement(matchBuffer,code.get(matcher.group());
}
matcher.appendTail(匹配缓冲区);
System.out.println(matchBuffer.toString());
}
}
代码中发生了什么:
- 首先,散列将代码存储到unescape
- 第二,变量html存储要处理的转义html
- 接下来,我们使用正则表达式搜索并替换转义代码,使用:
- Matcher.find()
- Matcher.appendReplacement(),以及
- appendTail()方法
试试看。我对像您这样的大文件的性能没有什么见解。但是,代码非常简单,您可以对其进行调整以获得所需的性能。Java有一些很好的核心功能来实现这一点,非常简单。 下面的解决方案使用正则表达式浏览您的内容,并允许您替换字符。此解决方案确实需要做一些工作,因为您需要提供转义码。您可以在此处找到转义码列表[http://www.w3.org/TR/html4/sgml/entities.html][1] 或者为其他人搜索网络 代码如下:
import java.util.regex.*;
import java.util.*;
public class HtmlUnescape {
public static void main(String[] args){
HashMap<String,String> codes = new HashMap<String,String>();
codes.put("<", "<");
codes.put(">", ">");
codes.put(""", "\"");
String html = "<html><head><title>Hello</title></head><body><h1>The great escape "example"</h1></body></html>";
Matcher matcher = Pattern.compile("&#*\\w\\w\\w?\\w?;").matcher(html);
StringBuffer matchBuffer = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(matchBuffer, codes.get(matcher.group()));
}
matcher.appendTail(matchBuffer);
System.out.println (matchBuffer.toString());
}
}
import java.util.regex.*;
导入java.util.*;
公共类逃逸{
公共静态void main(字符串[]args){
HashMap代码=新的HashMap();
代码。放置(“,”);
代码。放置(";,“\”);
String html=“htmlheadtitlehlello/title/headbodyh1大逃亡";示例";/h1/body/html”;
Matcher Matcher=Pattern.compile(*\\w\\w\\w?\\w?).Matcher(html);
StringBuffer matchBuffer=新的StringBuffer();
while(matcher.find()){
appendReplacement(matchBuffer,code.get(matcher.group());
}
matcher.appendTail(匹配缓冲区);
System.out.println(matchBuffer.toString());
}
}
代码中发生了什么:
- 首先,散列将代码存储到unescape李>
- 第二,变量html存储要处理的转义html李>
- 接下来,我们使用正则表达式搜索并替换转义代码,使用:
- Matcher.find()
- Matcher.appendReplacement(),以及
- appendTail()方法
试试看。我对像您这样的大文件的性能没有任何见解。但是,代码非常简单,您可以对其进行调整以获得所需的性能。谢谢您的回答。基本上,使用正则表达式的想法是好的,但是在大文件上使用它时,实现似乎太慢了。我现在用一个数据库解决了我的问题,该数据库与应用一起部署,减少了我收到的XML流的大小。但如果有人能给我指出另一个解决方案(更快的库或其他东西),我仍然会很感激:)谢谢你的回答。基本上,使用正则表达式的想法是好的,但是在大文件上使用它时,实现似乎太慢了。我现在用一个数据库解决了我的问题,该数据库与应用一起部署,减少了我收到的XML流的大小。但如果有人能给我指出另一种解决方案(更快的库或其他东西),我仍然会很感激:)