从 /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
}