2014-02-19 3 views
1

Я пытаюсь сохранить данные во внутреннем хранилище своего Android-приложения.Не удалось открыть файл при сохранении данных во внутреннем хранилище

Мой код:

File dir = context.getDir("dataDir", context.MODE_PRIVATE); 
File file = new File(dir, "myData"); 

FileOutputStream fos = null; 
ObjectOutputStream oos = null; 

fos = new FileOutputStream(file); //Exception here 
oos = new ObjectOutputStream(fos); 
oos.writeObject(MY_DATA); 
oos.flush(); 
... 
... 

Но я получил следующее исключение при открытии FileOutputStream:

java.io.FileNotFoundExceptoin ..., open failed: ENOENT (No such file or directory) 
02-19 12:18:23.006: V/MyApp(21019):  at libcore.io.IoBridge.open(IoBridge.java:427) 
02-19 12:18:23.006: V/MyApp(21019):  at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
02-19 12:18:23.006: V/MyApp(21019):  at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 

Почему он бросает это исключение? Где я ошибаюсь?

====== UPDATE (раствор) =======

После испробовали все ответы ниже, у меня нет никакой удачи, но в конце концов, я получил проблема решена , Дело заключается в следующем:

У меня есть отдельный класс для настойчивости:

public MyClass{ 
private Context context; 

private File dir; 
private File file; 

public MyClass(Context context){ 
    this.context = context; 

    // I used to initialize dir & file instances here 
    dir = context.getDir("dataDir", context.MODE_PRIVATE); 
    file = new File(dir, "myData"); 
} 

public void persistData(){ 
    //Seems I have to initiate dir & file in this function, then it works 
    dir = context.getDir("dataDir", context.MODE_PRIVATE); 
    file = new File(dir, "myData"); 

    //I used to have the following code without above 2 lines, which is not working 
    FileOutputStream fos = null; 
    ObjectOutputStream oos = null; 

    fos = new FileOutputStream(file); //Exception here 
    oos = new ObjectOutputStream(fos); 
    oos.writeObject(MY_DATA); 
    oos.flush(); 
    ... 
    ... 
} 

} 

Я делаю это за настойчивость:

MyClass my = new MyClass(context); 
my.persistData(); 

Я использовал для инициализации dir & file в конструкторе, и получить доступ к экземпляр в разных функциях MyClass, но мне кажется, что я должен их инициализировать в каждой функции, тогда он работает. Но не уверен, причина в этом .... если бы кто-нибудь мог объяснить мне.

+0

я думаю ваш файл нуждается в расширении, таком как myData.txt – Saqib

+0

Вы добавили это разрешение

+0

Это разрешение [не существует] (http://developer.android.com/reference/android/Manifest.permission.html). – PaF

ответ

0

Я не уверен в этом, но вам может понадобиться вызвать

if(!file.exists())  
    file.createNewFile() 

перед открытием FileOutputStream

+0

Я попробовал ваше предложение, я получил «IOException: open failed: ENOENT», который жалуется на java.io.File.createNewFile() –

0

Прежде чем обращаться к контрольному файлу, если файл существует или нет

File dir = context.getDir("dataDir", context.MODE_PRIVATE); 
if(! dir.exists()){ 
    if(dir.mkdir()); 
} 

File file = new File(dir, "myData"); 
if(! file .exists()){ 
    if(file .mkdir()); 
} 
Смежные вопросы