Не могу написать объект.Файловая система только для чтения - PullRequest
0 голосов
/ 04 августа 2011

Я пытаюсь сохранить этот объект, инвентарь, во внутреннее хранилище. У меня есть методы сохранения и получения в самом классе. Когда я пытаюсь вызвать метод save, я получаю исключение. У меня было сообщение об исключении, записываемое в Logcat, и вот что я получил:

08-04 02: 32: 23.690: VERBOSE / alex (278): / test (файловая система только для чтения)

Файл / тест - «Файловая система только для чтения», но я разрешил запись внешнего хранилища в файл манифеста:

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

Вот класс Inventory. Последние два метода - это методы сохранения и чтения.

    package com.androidbook.inventoryproject;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

import android.util.Log;

public class Inventory implements Serializable {
    private static final long serialVersionUID = 1L;
    int numIngred;;
    Ingredient[] ingredients;
    ArrayList ingred = new ArrayList<Ingredient>();

    public Inventory() {
        numIngred = 0;
        ingredients = new Ingredient[numIngred]; 
    }

    public int getNumIngred() {

        return numIngred;
    }

    public String getIngredientName(int n) {
        return ((Ingredient)ingred.get(n)).getName();

    }

    public Ingredient[] getIngredients() {
        return ingredients;
    }

    public Ingredient getIngredient(int n) {
        return (Ingredient)ingred.get(n);
    }

    public void addIngredient(String iname) {
        numIngred++;
        ingred.add(new Ingredient(iname));
    }

    public boolean saveInventory( Inventory inv) {
        File suspend_f = new File("test");
        FileOutputStream   fos  = null;
        ObjectOutputStream oos  = null;
        boolean            keep = true;
        try {
            fos = new FileOutputStream(suspend_f);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(inv);
        }
        catch (Exception e) {
            keep = false;
            Log.v("alex", "" + e.getMessage());

        }
        finally {
            try {
                if (oos != null)   oos.close();
                if (fos != null)   fos.close();
                if (keep == false) suspend_f.delete();
            }
            catch (Exception e) { /* do nothing */ }
        }
        return keep;
    }

    public Inventory getInventory() {
        File suspend_f = new File("test");
        Inventory inven = null;
        FileInputStream fis = null;
        ObjectInputStream ois = null;

        try{
            fis = new FileInputStream(suspend_f);
            ois = new ObjectInputStream(fis);
            inven = (Inventory)ois.readObject();
        }
        catch (Exception e) {
            String mess = e.getMessage();

        }
        finally {
            try {
                if (fis != null)  
                    fis.close();
                if (ois != null)  
                    ois.close();
            }
            catch (Exception e) { }
        }
        return inven;
    }
}

1 Ответ

2 голосов
/ 04 августа 2011

WRITE_EXTERNAL_STORAGE позволяет записывать на SD-карту, а не в корень файловой системы.Вы должны попробовать это:

File suspend_f = new File(Environment.getExternalStorageDirectory(), "test");

Это подтверждает, что файл, который вы используете, помещается во внешнюю папку, доступную для записи.

РЕДАКТИРОВАТЬ: есть куча других действий, которые вы должны выполнитьSD-карта доступна и доступна для записи.Прочтите спецификации , чтобы узнать, как сделать ваш доступ к файлам надежным, проверив доступность.

...