2013-02-28 91 views
1

我正在从文本文件中读取单词的字典应用程序,但文本文件的大小为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; 
    } 
+1

不确定它是否可以更有效,但10mb只是很大。在字典中,按照首字母来分割它并不奇怪。 – 2013-02-28 11:43:54

+1

@OlympicBeast是否有任何理由不使用SQLite数据库? – fardjad 2013-02-28 11:47:14

+0

@fardjad我以前从未在我的应用中使用SQLite数据库,所以我想我会使用该文本文件,因为稍后可以更容易地进行编辑。 – DevCon 2013-02-28 11:51:47

回答

0

人们可以使用的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; 
} 

使用数据库的建议是一个很好的了。

相关问题