【问题标题】:Control file with serialization带有序列化的控制文件
【发布时间】:2013-05-28 21:38:03
【问题描述】:

我正在开发一个应用程序,我想在文件中包含一个 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 文件。

【问题讨论】:

    标签: android file-io controls file-not-found


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了。如果此评论是答案,请随意标记此答案。谢谢!
    【解决方案2】:

    解决了:

    检查 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);
    

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多