我不理解以下代码

时间:2011-03-20 01:23:16

标签: android

我必须理解这段代码来创建我自己的应用程序(几乎基于此功能):

public static String[][] ReadFilePerLine(Context context, String nom) {
        int i = 0;
        try {
            FileInputStream fIn = context.openFileInput(nom);
            InputStreamReader ipsr = new InputStreamReader(fIn);
            BufferedReader b = new BufferedReader(ipsr);
            i = getLineNumber(context, nom);
            String[][] s = new String[2][i/2];
            i = 0;
            String ligne;
            int j = 0;
            while ((ligne = b.readLine()) != null) {
                if (i % 2 == 0)
                    s[0][j] = ligne;
                else {
                    s[1][j] = ligne;
                    j++;
                }
                i++;
            }
            fIn.close();
            ipsr.close();
            return s;

        } 
        catch (Exception e) 
        {}

我不明白为什么使用2D数组?和两行?(String [] [] s = new String [2] [i / 2];) 这是将存储在文件中的数据:

data = date + " : " + y + "L/100KM"+ " " + value1 + "L "+ value2 + "KM\n";

必要的功能:

 public void updatelv(Activity activity) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        String fileName = getResources().getString(R.string.fileName);
        fileDir = "" + preferences.getString("login", "") + "."+ preferences.getString("marque", "") + ".";
        s = myIO.ReadFilePerLine(getApplicationContext(), fileDir+fileName);
        ListView L = (ListView) findViewById(R.id.lv);
        L.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, s[0]));
        for (int i = 0; i< s[0].length; i++) { 
            Log.d("Saves",s[0][i]); 
        } 
        }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.histo);
        context = getApplicationContext();
        activity = this;
        final SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(context);
        String fileName = getResources().getString(R.string.fileName);
        fileDir = "" + preferences.getString("login", "") + "."+ preferences.getString("marque", "") + ".";
        s = myIO.ReadFilePerLine(getApplicationContext(), fileDir + fileName);

        updatelv(this);
        ListView L = (ListView) findViewById(R.id.lv);
        L.setTextFilterEnabled(true);

        L.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // When clicked, show a toast with the TextView text
                String tmp = s[1][position];
                if (tmp == null)
                    tmp = "Aucun fichier trouvé!";
                Toast.makeText(getApplicationContext(), tmp, Toast.LENGTH_SHORT)
                        .show();
            }
        });

ReadFilePerLine函数:

public static String[][] ReadFilePerLine(Context context, String nom) {
        int i = 0;
        try {
            FileInputStream fIn = context.openFileInput(nom);
            InputStreamReader ipsr = new InputStreamReader(fIn);
            BufferedReader b = new BufferedReader(ipsr);
            i = getLineNumber(context, nom);
            String[][] s = new String[2][i/2];
            i = 0;
            String ligne;
            int j = 0;
            while ((ligne = b.readLine()) != null) {
                if (i % 2 == 0)
                    s[0][j] = ligne;
                else {
                    s[1][j] = ligne;
                    j++;
                }
                i++;
            }
            fIn.close();
            ipsr.close();
            return s;

        } 
        catch (Exception e) 
        {

        }

谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

代码清楚地从一个文件中读取,该文件的格式由成对的行组成;它将每对中的第一行放在s[0][...]中,将每对中的第二行放在s[1][...]中。如果你的格式不具备那种特性 - 它听起来不像是那样 - 那么你就不需要这样做了。只需制作String s的普通1维数组。

答案 1 :(得分:1)

它似乎从文件中读取,将其拆分为二维数组(基于行数)。

为什么会这样呢?我不知道你为什么要那样。 查看它返回的功能并查找!

答案 2 :(得分:1)

看起来他们正在做的是将文件分成两个列表(在本例中为String数组),一个包含所有偶数行,另一个包含所有奇数行。我会为你评论代码:

public static String[][] ReadFilePerLine(Context context, String nom) {
    int i = 0;
    try {
        //open the specified input file and create a reader
        FileInputStream fIn = context.openFileInput(nom);
        InputStreamReader ipsr = new InputStreamReader(fIn);
        BufferedReader b = new BufferedReader(ipsr);

        //get the total number of lines in the file, and allocate 
        //a buffer large enough to hold them all
        i = getLineNumber(context, nom);
        String[][] s = new String[2][i/2];

        i = 0;      //set the current line to 0
        String ligne;
        int j = 0;  //set the section index to 0

        //now read through the lines in the file, and place every
        //even-numbered line in the first section ('s[0]'), and every 
        //odd-numbered line in the second section ('s[1]')
        while ((ligne = b.readLine()) != null) {
            if (i % 2 == 0)
                //even-numbered line, it goes into the first section
                s[0][j] = ligne;
            else {
                //odd-numbered line, it goes into the second section
                s[1][j] = ligne;
                j++;  //increment the section index
            }
            i++;  //increment the line count
        }

        //done, cleanup and return
        fIn.close();
        ipsr.close();
        return s;
    } 
    catch (Exception e) {
        //should at least log an error here...
    }
}

至于为什么他们选择使用String [] [],我不能说。可能为方便起见,因为他们想要一个可以从包含这两个列表的函数返回的单个对象。就个人而言,我会使用一个包含两个List实例的Map,但String [] []也可以正常运行,并且可能稍微提高效率。

根据您的示例数据判断,您似乎不需要使用此格式。但是如果你想使用它,你需要构建你的数据,以便密钥在一行上,并且它的相关值在下一行,如:

date
2011-03-19
userName
someGuy