0

我正在开发一个应用程序,我想在一个文件中有一个 ArrayList。我写了两种方法来保存和获取:

public static boolean saveMetars(Context context, ArrayList<Metar> metars) {
            try {
                FileOutputStream fos = context.openFileOutput("metars_array", Context.MODE_WORLD_READABLE);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(metars);
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }

            return true;
        }



        public static ArrayList<Metar> getArrayMetars(Context context) {
            try {
                 Log.d("here", "asas");
                FileInputStream fis = context.openFileInput("metars_array");
                            ObjectInputStream is = new ObjectInputStream(fis);
                Object readObject = is.readObject();
                is.close();

                if(readObject != null && readObject instanceof ArrayList) {
                    Log.d("here2", "asas");
                    return (ArrayList<Metar>) readObject;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

            return null;
        }

我的问题是:当用户安装应用程序并第一次使用它时,我有一个 xml 文件,我使用一种方法(在我的 appi 中创建)来读取它并创建 Metar 对象以添加到我的 ArrayList 中。问题是我想要一个 if 语句或类似的东西来控制文件是否

context.openFileOutput("metars_array", Context.MODE_WORLD_READABLE) 存在。

我做了

if(getApplicationContext().getDir("metars-array", MODE_WORLD_READABLE).exists() || getBaseContext().getDir("metars-array", MODE_WORLD_READABLE).exists()){
       ArrayList<Metar> mets = getArrayMetars(getBaseContext());
       isMetarsInDb=true;
}
else
    isMetarsInDb=false;

错误是它总是在第一个 if 和当我这样做时输入

ArrayList mets = getArrayMetars(getBaseContext());

它返回一个错误说

文件“/data/data/android.altmeter.com/app_metars_array”(未找到文件)

我想这样做是因为如果文件不存在(用户第一次使用该应用程序并且他从未序列化数组列表)我必须使用从 XML 读取的方法然后序列化到 metars_array 文件。

4

2 回答 2

1

从设计的角度来看,建议将数据存储为数据(以 XML 或数据库或某种结构化格式)。但是,为了有兴趣专门回答这个问题......

“metars-array”与目录“app_metars_array”不匹配(不同的URI)......其次,对目录和文件的引用似乎是混合的。仔细检查引用是对文件还是目录(即使检查了目录,我也没有看到目录遍历文件,而是文件引用)...

因此文件未找到错误。很直接。如果相对路径可能发生变化,请务必使用规范名称(完整路径)。也就是说,“/data”意味着“/data”位于根目录,但它是相对的吗?

于 2013-05-28T21:45:26.917 回答
0

其解决:

检查 timerTask:

    t.schedule(new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                   FileInputStream fis = getApplicationContext().openFileInput("metars_array");
                   ObjectInputStream is = new ObjectInputStream(fis);
                   Object readObject = is.readObject();
                   is.close();

                    if(readObject != null && readObject instanceof ArrayList) {

                        isInDb = true;
                        metars=(ArrayList<Metar>) readObject;
                        isMetToArrayFin=true;
                        t.cancel();
                    }

                    else{
                        isInDb = false;
                        xmlToStruct();
                        saveMetars(getApplicationContext(), metars);
                        t.cancel();
                    }
            }
             catch (Exception e) {
                        // TODO: handle exceptionrunOnUiThread(new Runnable()
                 isInDb = false;
                 xmlToStruct();
                 saveMetars(getApplicationContext(), metars);
                 t.cancel();
             }

        }
    },0,12000);
于 2013-05-28T23:20:30.643 回答