为什么我无法读取只读文件?

时间:2014-02-16 11:18:19

标签: java android android-activity

我有这个方法应该读取文件:

 /* Read file's content */
    private ArrayList<String> readFromFile() {
        File file = new File("jokesBody1.bjk");
        ArrayList<String> list = new ArrayList<String>();
        try {
            file.createNewFile();
            ObjectInputStream ois = new ObjectInputStream( new FileInputStream( file ) );
            try {
                list = (ArrayList)ois.readObject();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            ois.close();
            } catch (IOException e) {
            Log.e("log activity", "Can not read file: " + e.toString());
        }

        return list;
    }

当我打电话时,它会返回:

02-16 06:15:32.686: E/log activity(1380): Can not read file: java.io.IOException: open failed: EROFS (Read-only file system)

即使,如果文件是只读的,为什么我看不懂呢?我真的无法理解什么是wroong。我在我的清单中有这个暂停:

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

有人能给我一些线索吗?我知道我错过了一些小事,但我真的无法发现它。

以下是我编写文件的方式:

/* Write content to a file */
    private void writeToFile(ArrayList<String> list, Context cont) {
        File file = new File("jokesBody1.bjk");     
        FileOutputStream fos;
        if(list != null){
        try {           
                fos = cont.openFileOutput("jokesBody1.bjk", Context.MODE_PRIVATE);
                ObjectOutputStream out = new ObjectOutputStream(fos);
                out.writeObject(list);
                out.close();
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace(); 
        }
        }else{
            try {
                file.createNewFile();
                fos = openFileOutput("jokesBody1.bjk",Context.MODE_PRIVATE);
                ObjectOutputStream out = new ObjectOutputStream(fos);
                out.writeObject("");
                out.close();
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace(); 
        }
        }
    }

2 个答案:

答案 0 :(得分:4)

您正在尝试创建该文件,该文件当然在只读文件上失败。

删除此行:

file.createNewFile();

这通常用于在写入之前创建新的空文件。如果你只是想读取已经存在的文件,你真的不需要它。

修改

请使用:

ObjectInputStream ois = new ObjectInputStream( context.openFileInput("jokesBody1.bjk"));

当然,您还必须将Context传递给函数。

您只能使用File完整路径。要访问私有文件,请使用Context,就像保存文件一样。

您的全部功能应如下所示:

private ArrayList<String> readFromFile(Context context) {
    ArrayList<String> list = new ArrayList<String>();
    try {
        ObjectInputStream ois = new ObjectInputStream( context.openFileInput("jokesBody1.bjk"));
        try {
            list = (ArrayList)ois.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        ois.close();
        } catch (IOException e) {
        Log.e("log activity", "Can not read file: " + e.toString());
    }

    return list;
}

答案 1 :(得分:1)

您没有指定任何路径:

File file = new File("jokesBody1.bjk");

所以,你并不是说应用程序在哪里查找文件。

也许,你想在这里搜索一下吗?

Environment.getExternalStorageDirectory()