从 /res/raw/ 检索表格数据并将其存储到 Android 上的二维数组中的最快方法
Fastest way to retrieve tabulated data from /res/raw/ and store it into a 2D array on Android
我正在开发我的第一个 android 应用程序,所以请随时指出我是否做错了事情或建议另一种做事方式。
我有一个大文件 "table"。现在,我可以像这样将数据存储为 csv
a, "stuff with , commas"
b, "foo bar"
c, "test,"
或像这样xml
<row>
<number>a</number>
<equipment>"stuff with , commas"</equipment>
</row>
<row>
<number>b</number>
<equipment>"foo bar"</equipment>
</row>
<row>
<number>c</number>
<equipment>"test"</equipment>
</row>
我会使用我能更快检索和存储的任何一个。但是,我不想对数据进行硬编码。
我需要从 /res/raw/table.csv
或 /res/raw/table.xml
中读取数据并将其存储到列表列表、列表数组或数组数组中,同样,我将使用哪个最快。
我已经尝试了几件事:
InputStream equipmentCSV = getResources().openRawResource(R.raw.equipment);
String equipmentString = readTextFile(equipmentCSV);
ArrayList<ArrayList<String>> equipmentTable = new ArrayList<ArrayList<String>>();
Scanner scanner = new Scanner(equipmentString);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String [] splitLines = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
ArrayList <String> splitLinesList = new ArrayList<String>(Arrays.asList(splitLines));
equipmentTable.add(splitLinesList);
}
readTextFile 在哪里
public String readTextFile(InputStream inputStream) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
}
return outputStream.toString();
}
这花了太长时间,所以我认为 Scanner 可能太慢并且列表可能比我尝试的数组花费的时间更长:
String[] lines = equipmentString.split(System.getProperty("line.separator"));
String [][] equipmentTable = new String[lines.length][2];
for(int i = 0; i < lines.length ; i++){
String [] splitLines = lines[i].split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
equipmentTable[i][0] = splitLines[0];
equipmentTable[i][1] = splitLines[1];
}
这也花了太长时间。
执行此操作的更好方法是什么?
提前致谢。
尝试参考以下 links。他们应该可以帮助你。
https://code.google.com/p/secrets-for-android/source/browse/trunk/src/au/com/bytecode/opencsv/
http://opencsv.sourceforge.net/
这些库将负责读取和写入 CSV。
对于XML参考以下link。
http://simple.sourceforge.net/
它也有很好的文档。
这是像 EagleEye 推荐的那样使用 openCSV 的方法。
List<String []> equipmentList = new ArrayList< String [] >();
try {
// where your file in /res/raw/equipment.csv
InputStream file = getResources().openRawResource(R.raw.equipment);
CSVReader reader = new CSVReader(new InputStreamReader(file));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
equipmentList.add(nextLine);
}
} catch(IOException ie){
// deal with exception
}
// if you want to convert it to a 2d array from an arraylist of arrays
String[][] equipmentTable = (String[][])equipmentList.toArray();
要在 Android Studio 中添加库,您可以在此处下载 jar 文件:http://sourceforge.net/projects/opencsv/
然后将其添加到您的 libs 文件夹中,该文件夹应与您的 build in 和 src 文件夹位于同一目录中。
然后在 build.gradle
文件的 dependencies
下添加行 compile files('libs/opencsv-2.4.jar')
像这样
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
// whatever other dependencies ...
compile files('libs/opencsv-2.4.jar') // add this line for your jar file
}
我正在开发我的第一个 android 应用程序,所以请随时指出我是否做错了事情或建议另一种做事方式。
我有一个大文件 "table"。现在,我可以像这样将数据存储为 csv
a, "stuff with , commas"
b, "foo bar"
c, "test,"
或像这样xml
<row>
<number>a</number>
<equipment>"stuff with , commas"</equipment>
</row>
<row>
<number>b</number>
<equipment>"foo bar"</equipment>
</row>
<row>
<number>c</number>
<equipment>"test"</equipment>
</row>
我会使用我能更快检索和存储的任何一个。但是,我不想对数据进行硬编码。
我需要从 /res/raw/table.csv
或 /res/raw/table.xml
中读取数据并将其存储到列表列表、列表数组或数组数组中,同样,我将使用哪个最快。
我已经尝试了几件事:
InputStream equipmentCSV = getResources().openRawResource(R.raw.equipment);
String equipmentString = readTextFile(equipmentCSV);
ArrayList<ArrayList<String>> equipmentTable = new ArrayList<ArrayList<String>>();
Scanner scanner = new Scanner(equipmentString);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String [] splitLines = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
ArrayList <String> splitLinesList = new ArrayList<String>(Arrays.asList(splitLines));
equipmentTable.add(splitLinesList);
}
readTextFile 在哪里
public String readTextFile(InputStream inputStream) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
}
return outputStream.toString();
}
这花了太长时间,所以我认为 Scanner 可能太慢并且列表可能比我尝试的数组花费的时间更长:
String[] lines = equipmentString.split(System.getProperty("line.separator"));
String [][] equipmentTable = new String[lines.length][2];
for(int i = 0; i < lines.length ; i++){
String [] splitLines = lines[i].split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
equipmentTable[i][0] = splitLines[0];
equipmentTable[i][1] = splitLines[1];
}
这也花了太长时间。
执行此操作的更好方法是什么?
提前致谢。
尝试参考以下 links。他们应该可以帮助你。
https://code.google.com/p/secrets-for-android/source/browse/trunk/src/au/com/bytecode/opencsv/
http://opencsv.sourceforge.net/
这些库将负责读取和写入 CSV。
对于XML参考以下link。
http://simple.sourceforge.net/
它也有很好的文档。
这是像 EagleEye 推荐的那样使用 openCSV 的方法。
List<String []> equipmentList = new ArrayList< String [] >();
try {
// where your file in /res/raw/equipment.csv
InputStream file = getResources().openRawResource(R.raw.equipment);
CSVReader reader = new CSVReader(new InputStreamReader(file));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
equipmentList.add(nextLine);
}
} catch(IOException ie){
// deal with exception
}
// if you want to convert it to a 2d array from an arraylist of arrays
String[][] equipmentTable = (String[][])equipmentList.toArray();
要在 Android Studio 中添加库,您可以在此处下载 jar 文件:http://sourceforge.net/projects/opencsv/
然后将其添加到您的 libs 文件夹中,该文件夹应与您的 build in 和 src 文件夹位于同一目录中。
然后在 build.gradle
文件的 dependencies
下添加行 compile files('libs/opencsv-2.4.jar')
像这样
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
// whatever other dependencies ...
compile files('libs/opencsv-2.4.jar') // add this line for your jar file
}