文本文件的大小为560千字节,大约有24500行。每行都添加到列表中。也许我的手机老了还慢?手机型号:三星GT-S5570搭配Android 2.3.4。 阅读它需要大约30秒或更长时间,我很确定我在Reader类之外的算法不是问题。其他遇到类似问题或者想知道问题可能是什么的人呢?
public class Reader {
public List<String> read(String file) {
Context ctx = ApplicationContextProvider.getContext();
List<String> entries = new ArrayList<String>();
//Get res/raw text-file id.
int resId = ctx.getResources().getIdentifier(file,"raw", ctx.getPackageName());
InputStream inputStream = ctx.getResources().openRawResource(resId);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream), 8192);
try {
String test;
while (true) {
test = reader.readLine();
if (test == null)
break;
entries.add(test);
}
inputStream.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return entries;
}
}
答案 0 :(得分:1)
您描述的设备是一个非常古老而缓慢的设备。您应该尽可能地通过以下方式加快阅读过程:
测量每个部分花费的时间也是一个好主意 - 读取文件并将24500个字符串插入ArrayList。糟糕的表现可能来自最不期望的方向。
请尝试以下方法并分享结果(如果可能,请进行时间测量):
private char[] readWholeFile(String file) {
Context ctx = ApplicationContextProvider.getContext();
int resId = ctx.getResources().getIdentifier(file, "raw", ctx.getPackageName());
InputStream inputStream = ctx.getResources().openRawResource(resId);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream), 8192);
try {
int length = inputStream.available();
char[] contents = new char[length];
reader.read(contents, 0, length);
return contents;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
if (reader != null) reader.close();
} catch (Exception e) {
}
}
}
public List<String> readEntries() {
final int EXPECTED_ELEMENTS = 24500;
char[] contents = readWholeFile("somefile");
if (contents == null) {
return new ArrayList<String>();
}
List<String> entries = new ArrayList<String>(EXPECTED_ELEMENTS);
String test;
BufferedReader reader = new BufferedReader(new CharArrayReader(contents));
try {
while ((test = reader.readLine()) != null) {
entries.add(test);
}
return entries;
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<String>();
} finally {
try {
if (reader != null) reader.close();
} catch (Exception e) {
}
}
}
答案 1 :(得分:0)
如果您使用来自apache“commons-io”的IOUtils,那就更容易了。
InputStream is = getResources().openRawResource(R.raw.yourNewTextFile);
String s = IOUtils.toString(is);
IOUtils.closeQuietly(is); // don't forget to close your streams
你可以从中下载它们 http://commons.apache.org/proper/commons-io/ 要么 http://mvnrepository.com/artifact/commons-io/commons-io