我有一个读取资产文件并将其内容存储在数组中的函数。这是一个代码。读取多个资产时OutOfMemoryError
private List<String> infinitivesDB;
private List<String> formsDB;
private void getDB(String lang, String type)
{
while(true)
{
try {
String infinitivesDB = getStringFromAssetFile(this, "inf.txt");
this.infinitivesDB = new LinkedList(Arrays.asList(infinitivesDB.split("\n")));
break; //would be needed if it was reachable
} catch (IOException e) {
e.printStackTrace();
}
}
while(true)
{
try {
String formsDB = getStringFromAssetFile(this, "forms.txt");//EXCEPTION HERE?
this.formsDB = new LinkedList(Arrays.asList(formsDB.split("\n")));
break; //would be needed if it was reachable
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件“inf.txt”是58kb。文件“forms.txt”是3.5 Mb。
每当我尝试运行此代码,它提出了一个OutOfMemoryError。这里的日志
07-27 02:40:13.399: E/AndroidRuntime(2017): FATAL EXCEPTION: main
07-27 02:40:13.399: E/AndroidRuntime(2017): Process: com.highstaker.formdictionary, PID: 2017
07-27 02:40:13.399: E/AndroidRuntime(2017): java.lang.OutOfMemoryError
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.util.Scanner.expandBuffer(Scanner.java:2067)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.util.Scanner.readMore(Scanner.java:2031)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.util.Scanner.findDelimiterAfter(Scanner.java:2009)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.util.Scanner.setTokenRegion(Scanner.java:1923)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.util.Scanner.hasNext(Scanner.java:541)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.util.Scanner.hasNext(Scanner.java:519)
07-27 02:40:13.399: E/AndroidRuntime(2017): at com.highstaker.formdictionary.MainActivity.convertStreamToString(MainActivity.java:411)
07-27 02:40:13.399: E/AndroidRuntime(2017): at com.highstaker.formdictionary.MainActivity.getStringFromAssetFile(MainActivity.java:404)
07-27 02:40:13.399: E/AndroidRuntime(2017): at com.highstaker.formdictionary.MainActivity.getDB(MainActivity.java:389)
07-27 02:40:13.399: E/AndroidRuntime(2017): at com.highstaker.formdictionary.MainActivity.onCreate(MainActivity.java:50)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.Activity.performCreate(Activity.java:5243)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.ActivityThread.access$700(ActivityThread.java:135)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.os.Handler.dispatchMessage(Handler.java:102)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.os.Looper.loop(Looper.java:137)
07-27 02:40:13.399: E/AndroidRuntime(2017): at android.app.ActivityThread.main(ActivityThread.java:4998)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.lang.reflect.Method.invokeNative(Native Method)
07-27 02:40:13.399: E/AndroidRuntime(2017): at java.lang.reflect.Method.invoke(Method.java:515)
07-27 02:40:13.399: E/AndroidRuntime(2017): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
07-27 02:40:13.399: E/AndroidRuntime(2017): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
07-27 02:40:13.399: E/AndroidRuntime(2017): at dalvik.system.NativeStart.main(Native Method)
07-27 02:40:15.179: I/Process(2017): Sending signal. PID: 2017 SIG: 9
但是,如果我尝试读取只有一个文件(通过注释掉的while循环和它的内容之一),无论我选择哪个文件 - 它工作正常。如果我尝试在两个循环中读取“inf.txt”(较小)并存储在这些不同的数组中,它也可以正常工作。
而且,如果我只需将“田地”,因此读小一前较大的文件,它也可以!
我想知道为什么会发生这种情况。另外,如果两个资产文件都很大,我又该如何阅读?我试图在两个循环中读取“forms.txt”(更大),并提出了相同的错误(我预料到,真的)。
我怀疑错误来自这段代码。请参阅http://sscce.org/ – Unihedron
问题是更多的方法'getStringFromAssetFile'你可以发布它的代码。 –