在Android应用程序中读取大型10mb文本文件
问题描述:
我正在从文本文件中读取单词的字典应用程序,但文本文件的大小为10mb,因此无法在模拟器或设备上运行它由于内存限制。在Android应用程序中读取大型10mb文本文件
那么这个问题的解决方案是什么?我可以在压缩文件时从压缩文件读取文本文件,还是将它分成10个独立的文本文件(每个文件文件为1mb)会更好?
下面是当前阅读文本文件的代码,我必须对代码做些什么改变?
private synchronized void loadWords(Resources resources) throws IOException {
if (mLoaded) return;
Log.d("dict", "loading words");
InputStream inputStream = resources.openRawResource(R.raw.definitions);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String line;
while((line = reader.readLine()) != null) {
String[] strings = TextUtils.split(line, ":");
if (strings.length < 2) continue;
addWord(strings[0].trim(), strings[1].trim());
}
} finally {
reader.close();
}
mLoaded = true;
}
public synchronized List<Word> getAllMatches(Resources resources) throws IOException {
List<Word> list = new ArrayList<Word>();
InputStream inputStream = resources.openRawResource(R.raw.definitions);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String line;
while((line = reader.readLine()) != null) {
String[] strings = TextUtils.split(line, ":");
if (strings.length < 2) continue;
Word word = new Word(strings[0].trim(), strings[1].trim());
list.add(word);
}
} finally {
reader.close();
}
return list;
}
答
人们可以使用的gzip单个文件压缩( “大text.txt.gz”),并使用GZipInputStream。
相同的字符串应该在内存中保留一次。在需要时,通过一个字符串之前,你可以搜索一下:
Map<String, String> sharedStrings = new HashMap<>();
String share(String s) {
String sToo = sharedStrings.get(s);
if (sToo == null) {
sToo = s;
sharedStrings.put(s, s);
}
return sToo;
}
使用数据库的建议是一个很好的了。
不确定它是否可以更有效,但10mb只是很大。在字典中,按照首字母来分割它并不奇怪。 – 2013-02-28 11:43:54
@OlympicBeast是否有任何理由不使用SQLite数据库? – fardjad 2013-02-28 11:47:14
@fardjad我以前从未在我的应用中使用SQLite数据库,所以我想我会使用该文本文件,因为稍后可以更容易地进行编辑。 – DevCon 2013-02-28 11:51:47