在外部存储器中的文件中编写类对象

时间:2012-12-26 08:40:13

标签: android android-file

起初,我使用Nexus 7作为我的测试设备。

我想保存一个类对象及其所有变量当前值在文件中,并希望将文件保存在这样的地方,以便在重新启动手机后(假设手机被用户关闭),我可以从文件中获取对象,并可以使用数据(保存在保存的对象类中的变量中)供我进一步使用。我应该在哪里保存我的文件(使用该对象),以便它适用于大多数设备。

这是我的代码(在extarnal存储中的文件中写一个类对象):

File file = new File(Environment.getExternalStorageDirectory(), "savedData"); 
                    if(!file.exists()){
                        file.createNewFile();
                        Toast.makeText(getActivity(), "not exist", Toast.LENGTH_LONG).show();
                    }else{
                        Toast.makeText(getActivity(), "exist", Toast.LENGTH_LONG).show();
                    }
                    if(file.canWrite())
                        Toast.makeText(getActivity(), "writable", Toast.LENGTH_LONG).show();
                    else
                        Toast.makeText(getActivity(), "not writable", Toast.LENGTH_LONG).show();
                    FileOutputStream fos = new FileOutputStream(file);
                    String car = "ferrari";

                    ObjectOutputStream os = new ObjectOutputStream(fos);
                    os.writeObject(app);

                    os.writeObject(car);
                    os.close();

这是我的代码(从extarnal存储文件中读取类对象):

File file = new File(Environment.getExternalStorageDirectory(), "savedData");

            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream is = new ObjectInputStream(fis);
            savedData = (SavedFriend) is.readObject();

            String car = (String) is.readObject();
            Toast.makeText(getApplicationContext(), car, Toast.LENGTH_LONG).show();
            is.close();

我在一个类中编写了对象,并从另一个类中读取它。正如你所看到的,我已经编写了一个字符串(car)作为测试用的对象和类对象。我在另一堂课上读过这些。现在class对象和字符串(car)的值完美呈现。这意味着它们在外部存储器中的文件中写得很好。但当我关闭我的Nexux 7(用于测试应用程序)并再次运行应用程序时,string(car)的值显示完美,但类对象中的变量值显示为null。问题是什么? 在我的清单中我添加了:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

顺便说一下,我想把对象的对象写成对象implements Serializable ....甚至,我对所有类都有implements Serializable进行测试。但它不起作用。 我不能使用数据库或其他存储技术,因为我已经走了很长的路与这个应用程序,所以如果我使用其他技术,我必须改变我的大部分代码。请帮忙。

是否可以在手机的内部记忆中写入对象?我之前也使用getActivity().getApplicationContext().openFileOut()编写了该文件。但我用这种方法解决了同样的问题。

编辑:

SavedFriend Class:

public class SavedFriend extends Application implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static List<GraphUser> selectedUsers;
    private static String friendsId;
    private static Session session;
    private static Bundle bundle;
    private static Context context;
    private static long time;
    private static int year, month, date, hour, min;
    //private Activity activity;

    //dynamic
    private static String[] pmsg = new String[5];
    private static String[] smsg = new String[5];
    private static String[] fmsg = new String[5];

    private static long[] ptime = new long[5];
    private static long[] stime = new long[5];
    private static long[] ftime = new long[5];

    private static int[] pyear = new int[5];
    private static int[] syear = new int[5];
    private static int[] fyear = new int[5];

    private static int[] pmonth = new int[5];
    private static int[] smonth = new int[5];
    private static int[] fmonth = new int[5];

    private static int[] pdate = new int[5];
    private static int[] sdate = new int[5];
    private static int[] fdate = new int[5];

    private static int[] phour = new int[5];
    private static int[] shour = new int[5];
    private static int[] fhour = new int[5];

    private static int[] pmin = new int[5];
    private static int[] smin = new int[5];
    private static int[] fmin = new int[5];

    private static String[] pfriendName = new String[5];
    private static String[] sfriendName = new String[5];
    private static String[] ffriendName = new String[5];

    private static String[] pfriendId = new String[5];
    private static String[] sfriendId = new String[5];
    private static String[] ffriendId = new String[5];

    private static String[] pDateTime = new String[5];
    private static String[] sDateTime = new String[5];
    private static String[] fDateTime = new String[5];


    private static int pmaster_key = -1;
    private static int smaster_key = -1;
    private static int fmaster_key = -1;

    public void setYear(int year){
        SavedFriend.year = year;
    }

    public void setMonth(int month){
        SavedFriend.month = month;
    }

    public void setDate(int date){
        SavedFriend.date = date;
    }

    public void setHour(int hour){
        SavedFriend.hour = hour;
    }

    public void setMin(int min){
        SavedFriend.min = min;
    }

    public static int getYear (){
        return year;
    }

    public static int getMonth (){
        return month;
    }

    public static int getDate (){
        return date;
    }

    public static int getHour (){
        return hour;
    }

    public static int getMin (){
        return min;
    }

    public static List<GraphUser> getSelectedUsers() {
        return selectedUsers;
    }

    public void setSelectedUsers(List<GraphUser> selectedUsers) {
        SavedFriend.selectedUsers = selectedUsers;
    }

    public static String getfriendsId() {
        return friendsId;
    }

    public void setfriendsId(String id) {
        SavedFriend.friendsId = id;
    }

    public static Session getSession(){
        return session;
    }

    public void setSession(Session session){
        this.session = session;
    }

    public void setContext(Context context){
        this.context = context;
    }

    public static Context getContext(){
        return context;
    }

    /*public void setActivity(Activity activity){
        this.activity = activity;
    }

    public Activity getActivity(){
        return activity;
    }*/

    public void setBundle(Bundle bundle){
        SavedFriend.bundle = bundle;
    }

    public Bundle getBundle(){
        return bundle;
    }

    public void setPmsg(String Pmsg, long Ptime, String Pfriendname, String Pfriendid,
            int year, int month, int date, int hour, int min){
        Log.e("key before inc",Integer.toString(pmaster_key));
        pmaster_key++;
        Log.e("key after inc",Integer.toString(pmaster_key));
        if(pmaster_key == 0){
            pmsg[pmaster_key] = Pmsg;
            ptime[pmaster_key] = Ptime;
            pfriendName[pmaster_key] = Pfriendname;
            pfriendId[pmaster_key] = Pfriendid;
            pyear[pmaster_key] = year;
            pmonth[pmaster_key] = month;
            pdate[pmaster_key] = date;
            phour[pmaster_key] = hour;
            pmin[pmaster_key] = min;

            Log.e("first entry", pmsg[pmaster_key]);
            //write();
        }else{
            boolean check = false;
            for(int i=0; i<pmaster_key; i++){
                if(ptime[i] < Ptime){
                    long temp1 = 0;
                    String temp2 = null;
                    String temp3 = null;
                    String temp4 = null;
                    int temp5 = 0;
                    int temp6 = 0;
                    int temp7 = 0;
                    int temp8 = 0;
                    int temp9 = 0;
                    for(int j=i; j<=pmaster_key; j++){
                        if(j<pmaster_key){
                            temp1 = ptime[j];
                            temp2 = pmsg[j];
                            temp3 = pfriendName[j];
                            temp4 = pfriendId[j];
                            temp5 = pyear[j];
                            temp6 = pmonth[j];
                            temp7 = pdate[j];
                            temp8 = phour[j];
                            temp9 = pmin[j];
                        }

                        pmsg[j] = Pmsg;
                        ptime[j] = Ptime;
                        pfriendName[j] = Pfriendname;
                        pfriendId[j] = Pfriendid;
                        pyear[j] = year;
                        pmonth[j] = month;
                        pdate[j] = date;
                        phour[j] = hour;
                        pmin[j] = min;

                        if(j<pmaster_key){
                            Pmsg = temp2;
                            Ptime = temp1;
                            Pfriendname = temp3;
                            Pfriendid = temp4;
                            year = temp5;
                            month = temp6;
                            date = temp7;
                            hour = temp8;
                            min = temp9;
                        }
                        Log.e("sorted entry", pmsg[j]);
                        Log.e("key & j",Integer.toString(pmaster_key)+", "+Integer.toString(j));
                        check = true;
                    }
                }
                if(check){
                    Log.e("sorted entry after loop", pmsg[pmaster_key]);
                    break;
                }
            }
            if(!check){

                pmsg[pmaster_key] = Pmsg;
                ptime[pmaster_key] = Ptime;
                pfriendName[pmaster_key] = Pfriendname;
                pfriendId[pmaster_key] = Pfriendid;
                pyear[pmaster_key] = year;
                pmonth[pmaster_key] = month;
                pdate[pmaster_key] = date;
                phour[pmaster_key] = hour;
                pmin[pmaster_key] = min;
                Log.e("sorted entry last pos", pmsg[pmaster_key]);
            }
            //write();
        }
    }

    public void setSmsg(){
        smaster_key++;
        if(smaster_key>5)
            smaster_key = 0;

        smsg[smaster_key] = pmsg[pmaster_key];
        stime[smaster_key] = ptime[pmaster_key];
        sfriendName[smaster_key] = pfriendName[pmaster_key];
        sfriendId[smaster_key] = pfriendId[pmaster_key];
        syear[smaster_key] = pyear[pmaster_key];
        smonth[smaster_key] = pmonth[pmaster_key];
        sdate[smaster_key] = pdate[pmaster_key];
        shour[smaster_key] = phour[pmaster_key];
        smin[smaster_key] = pmin[pmaster_key];
        Log.e("one entry deleted", pmsg[pmaster_key]);

        pmaster_key--;
    }

    public void setFmsg(){
        fmaster_key++;
        if(fmaster_key>5)
            fmaster_key = 0;

        fmsg[fmaster_key] = pmsg[pmaster_key];
        ftime[fmaster_key] = ptime[pmaster_key];
        ffriendName[fmaster_key] = pfriendName[pmaster_key];
        ffriendId[fmaster_key] = pfriendId[pmaster_key];
        fyear[fmaster_key] = pyear[pmaster_key];
        fmonth[fmaster_key] = pmonth[pmaster_key];
        fdate[fmaster_key] = pdate[pmaster_key];
        fhour[fmaster_key] = phour[pmaster_key];
        fmin[fmaster_key] = pmin[pmaster_key];

        pmaster_key--;
    }

    public static int[] getPyear(){
        return pyear;
    }

    public static int[] getPmonth(){
        return pmonth;
    }

    public static int[] getPdate(){
        return pdate;
    }

    public static int[] getPhour(){
        return phour;
    }

    public static int[] getPmin(){
        return pmin;
    }

    public static int[] getSyear(){
        return syear;
    }

    public static int[] getSmonth(){
        return smonth;
    }

    public static int[] getSdate(){
        return sdate;
    }

    public static int[] getShour(){
        return shour;
    }

    public static int[] getSmin(){
        return smin;
    }

    public static int[] getFyear(){
        return fyear;
    }

    public static int[] getFmonth(){
        return fmonth;
    }

    public static int[] getFdate(){
        return fdate;
    }

    public static int[] getFhour(){
        return fhour;
    }

    public static int[] getFmin(){
        return fmin;
    }

    public static int getPmaster_key(){
        return pmaster_key;
    }

    public static int getSmaster_key(){
        return smaster_key;
    }

    public static int getFmaster_key(){
        return fmaster_key;
    }

    public static String[] getPmsg(){
        return pmsg;
    }

    public static String[] getSmsg(){
        return smsg;
    }

    public static String[] getFmsg(){
        return fmsg;
    }

    public static long[] getPtime(){
        return ptime;
    }

    public static long[] getStime(){
        return stime;
    }

    public static long[] getFtime(){
        return ftime;
    }

    public static String[] getPfriendname(){
        return pfriendName;
    }

    public static String[] getSfriendname(){
        return sfriendName;
    }

    public static String[] getFfriendname(){
        return ffriendName;
    }

    public static String[] getPfriendid(){
        return pfriendId;
    }

    public static String[] getSfriendid(){
        return sfriendId;
    }

    public static String[] getFfriendid(){
        return ffriendId;
    }

    public static String[] getPdateTime(){
        return pDateTime;
    }

    public static String[] getSdateTime(){
        return sDateTime;
    }

    public static String[] getFdateTime(){
        return fDateTime;
    }

    public void setTime(long time){
        SavedFriend.time = time;
    }

    public static long getTime(){
        return time;
    }

    public void Delete(int position){
        if(position == pmaster_key){
            pmaster_key--;
        }else{
            for(int i=position; i<pmaster_key; i++){
                pmsg[i] = pmsg[i+1];
                ptime[i] = ptime[i+1];
                pfriendName[i] = pfriendName[i+1];
                pfriendId[i] = pfriendId[i+1];
                pyear[i] = pyear[i+1];
                pmonth[i] = pmonth[i+1];
                pdate[i] = pdate[i+1];
                phour[i] = phour[i+1];
                pmin[i] = pmin[i+1];
            }
            pmaster_key--;
        }
    }

    public void Edit(int position, String Nmsg, long Ntime, String NfriendName, String NfriendId,
            int Nyear, int Nmonth, int Ndate, int Nhour, int Nmin){
        pmsg[position] = Nmsg;
        ptime[position] = Ntime;
        pfriendName[position] = NfriendName;
        pfriendId[position] = NfriendId;
        pyear[position] = Nyear;
        pmonth[position] = Nmonth;
        pdate[position] = Ndate;
        phour[position] = Nhour;
        pmin[position] = Nmin;
    }

    public void writeNow (){
        try {
            File file = new File(Environment.getExternalStorageDirectory(), "savedData"); 
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(new SavedFriend());
            os.close();
        } catch (Exception e) {
            Toast.makeText(context, "Unknown error", Toast.LENGTH_LONG).show();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

SavedFriend类中的字段不应该是静态的。序列化期间不会写入静态字段。