无法写入对象。只读文件系统

发布于 2024-11-28 02:11:03 字数 2941 浏览 0 评论 0原文

我正在尝试将这个对象(库存)保存到内部存储中。我在类本身中有保存和获取方法。当我尝试调用 save 方法时,我最终遇到了异常。我将异常消息写入 Logcat,这就是我得到的:

08-04 02:32:23.690: VERBOSE/alex(278): /test (只读文件系统)

文件 /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;
    }
}

I'm trying to save this Object, Inventory, to the internal storage. I have the saving and getting methods in the class itself. When I try and call the save method, I end up with the exception. I had the Exception message write to the Logcat, and here's what I got:

08-04 02:32:23.690: VERBOSE/alex(278): /test (Read-only file system)

The file /test is "Read-only file system", but I had allowed writing external storage in the Manifest file:

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

Here's the Inventory class. The last two methods are the save and read methods.

    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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情感失落者 2024-12-05 02:11:03

WRITE_EXTERNAL_STORAGE 允许您写入 SD 卡,而不是文件系统根目录。您应该尝试这样做:

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

这将验证您正在使用的文件是否进入可写的外部文件夹。

编辑:您还应该做很多其他工作来验证 SD 卡是否可用且可写。阅读规范了解如何访问您的文件通过检查可用性来实现稳健。

WRITE_EXTERNAL_STORAGE lets you write to the SD card, not to the filesystem root. You should try this:

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

This verifies that the file you are using goes into a writable external folder.

EDIT: there is a bunch of other work you should do to verify that the SD card is available and writable. Read the specs to see how to make your file access robust by checking availability.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文