无法按预期将我的arrayList写入文件

时间:2014-02-12 14:29:59

标签: java android file android-activity

我有这个方法,应该将arrayList写入文件:

private ArrayList<String> readFromFile() {
    String ret = "";
    ArrayList<String> list = new ArrayList<String>();
try {
    InputStream inputStream = openFileInput("jokesBody.bjk");

    if (inputStream != null) {
        InputStreamReader inputStreamReader = new InputStreamReader(
                inputStream);
        BufferedReader bufferedReader = new BufferedReader(
                inputStreamReader);
        String receiveString = "";
        StringBuilder stringBuilder = new StringBuilder();

        while ((receiveString = bufferedReader.readLine()) != null) {
            list.add(receiveString);
        }

        inputStream.close();
        ret = stringBuilder.toString();
        System.out.println("DA CRAZY FILE: " + ret);
    }
} catch (FileNotFoundException e) {
    Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
    Log.e("login activity", "Can not read file: " + e.toString());
}

return list;
}

它的问题在于,当我需要将值加载回[item1, item2, item3]时,它会写入像listArray这样的值,它会在索引0处加载整行。现在我找到了写入和读取arrayList的核心方法,但我在访问teh文件时遇到了麻烦。

这是我尝试过的代码:

     private void writeToFile(ArrayList<String> list) {
                try {

                     FileOutputStream fos = new FileOutputStream("jokesBody.bjk");
                        ObjectOutputStream oos = new ObjectOutputStream(fos);   
                        oos.writeObject(list); // write MenuArray to ObjectOutputStream
                        oos.close(); 

                } catch (IOException e) {
                    Log.e("Exception", "File write failed: " + e.toString());

                        }
}

但它引发了以下异常:

02-12 09:21:10.227: E/Exception(2445): File write failed: java.io.FileNotFoundException: /jokesBody.bjk: open failed: EROFS (Read-only file system)

错误在哪里,默认的app文件位置在哪里?我知道我错过了一些小东西,但作为一个Android初学者,我无法发现它。

4 个答案:

答案 0 :(得分:3)

不是这个:

java.io.FileNotFoundException: /jokesBody.bjk: open failed: EROFS (Read-only file system)
问题是什么?你正在写一个不可写的区域。改变你写的地方(也许creating a temporary file would be a simple first step - 我不熟悉Android,但我认为这是可能的)

答案 1 :(得分:1)

您的文件似乎只读。你不能写一个只读文件!!!

答案 2 :(得分:1)

我认为您实际上并未将文件保存在您认为自己的位置。将文件写入外部存储时,请查看this tutorial。一些事情:

(1)您需要在清单中请求权限才能写入外部存储。如果不是,你最终会得到一个只读的情况。

(2)在写入代码之前,需要在代码中获取外部存储目录。这应该首先检查您的文件目录是否可写在第一位:

public boolean isExternalStorageWritable() {    
    String state = Environment.getExternalStorageState();    
    if (Environment.MEDIA_MOUNTED.equals(state)) {        
        return true;    
    }    
    return false;
}

然后,您可以为要存储的文件创建特定目录,并将其存储在该位置,以便日后查找。例如:

public File getAlbumStorageDir(String albumName) { 
    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName);    
    if (!file.mkdirs()) {        
        Log.e(LOG_TAG, "Directory not created");    
    }    
    return file;
}

然后,您可以将内容写入返回的文件

答案 3 :(得分:1)

在为Android开发时,必须从Context获取OutputStream:

fos = context.openFileOutput("jokesBody.bjk", Context.MODE_PRIVATE);

有关如何在Android上处理文件的说明,请访问:Saving Files