2011-04-23 2 views
29

Я пытаюсь сохранить текстовый файл в моей папке, во внутренней памяти, но я сталкиваюсь с той же проблемой каждый раз, когда:Сохранить внутренний файл в моей собственной внутренней папке в Android

«Источник не найден»

Я пишу свой код по-разному, выраженный здесь следующим образом, но во всех отношениях у меня такая же проблема.

Стоит сказать, что я даже добавить

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

в Manifest.xml, что не является необходимым для внутреннего хранения.

Излишне говорить, что у меня нет никаких проблем, чтобы сохранить файлы в /данные/данные/пакет/файлах пути, но когда я добавить свою папку в корневом каталоге файлов, например /данные/data/package/files/myforlder/myfile.txt Я столкнулся с проблемой «Источник не найден».

Не могли бы вы указать мне в правильном направлении, чтобы решить эту проблему?

Второй вопрос заключается в том, что для сохранения файла во внешней папке во внешнем хранилище.
(например: sdCard или USB-накопитель) - это сценарий по-другому или он такой же?

Первый способ:

OutputStreamWriter out; 
try { 
    File path=new File(getFilesDir(),"myfolder"); 
    File mypath=new File(path,"myfile.txt"); 
    if (!mypath.exists()) { 
     out = new OutputStreamWriter(openFileOutput(mypath.getAbsolutePath() , MODE_PRIVATE)); 
     out.write("test"); 
     out.close(); 
    }       
} 

Второй способ:

OutputStreamWriter out; 
try { 
    ContextWrapper cw = new ContextWrapper(this); 
    File path = cw.getDir("myfolder", Context.MODE_PRIVATE); 
    if (!path.exists()) { 
     path.createNewFile(); 
     path.mkdir(); 
    } 
    File mypath=new File(path,"myfile.txt"); 
    if (!mypath.exists()) { 
     out = new OutputStreamWriter(openFileOutput(mypath.getAbsolutePath() , MODE_PRIVATE)); 
     out.write("test"); 
     out.close(); 
    } 
} 

Третий путь:

File path=getFilesDir(); 
String mypath=path.toString() + "/myfolder"; 
OutputStreamWriter out; 
try { 
    File f = new File(mypath , "/myfile.txt" ); 
out = new OutputStreamWriter(openFileOutput(f.getPath(), MODE_PRIVATE)); 
    out.write("test"); 
    out.close();     
    } 

Четвертый путь:

File path=getFilesDir(); 

OutputStreamWriter out; 
    try { 
    File f = new File(path.getPath() + "/myfolder/myfile.txt" ); 
    out = new OutputStreamWriter(openFileOutput(f.getPath(), MODE_PRIVATE)); 
    out.write("test"); 
    out.close();      
    } 

Пятый путь:

File path=getFilesDir();     
OutputStreamWriter out; 
try { 
    File f = new File(path.getCanonicalPath() + "/myfile.txt"); 
    out = new OutputStreamWriter(openFileOutput(f.getPath(), MODE_PRIVATE)); 
    out.write("test"); 
    out.close();      
    } 
+1

При написании вашего вопроса выберите код и нажмите ctrl + k, это будет автоиндентировать и раскрасить ваш код. , так что это более читаемо. Никто не захочет читать этот код незапятнанным и неокрашенным. –

ответ

55

Первый способ:

Вы не создали каталог. Кроме того, вы проходите абсолютный путь до openFileOutput(), что неверно.

Второй способ:

Вы создали пустой файл с желаемым именем, которое затем предотвратить вас от создания каталога. Кроме того, вы проходите абсолютный путь до openFileOutput(), что неверно.

Третий путь:

Вы не создали каталог. Кроме того, вы проходите абсолютный путь до openFileOutput(), что неверно.

Четвертый путь:

Вы не создали каталог. Кроме того, вы проходите абсолютный путь до openFileOutput(), что неверно.

Пятый путь:

Вы не создали каталог. Кроме того, вы проходите абсолютный путь до openFileOutput(), что неверно.

Правильный путь:

  1. Создание File для нужного каталога (например, File path=new File(getFilesDir(),"myfolder");)
  2. Вызов mkdirs() на этом File создать каталог, если он не существует
  3. Создать File для выходной файл (например, File mypath=new File(path,"myfile.txt");)
  4. Используйте standard Java I/O для записи на него File (например, используя new BufferedWriter(new FileWriter(mypath)))
+0

- это файл и папка, созданные во внутренней памяти или SD-карте? – Shoshi

+0

@Shoshi: 'getFilesDir()' представляет собой внутреннее хранилище. – CommonsWare

+0

thankx. @CommonsWare – Shoshi

10

Сохранить:

public boolean saveFile(Context context, String mytext){ 
    Log.i("TESTE", "SAVE"); 
    try { 
     FileOutputStream fos = context.openFileOutput("file_name"+".txt",Context.MODE_PRIVATE); 
     Writer out = new OutputStreamWriter(fos); 
     out.write(mytext); 
     out.close(); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

Нагрузка:

public String load(Context context){ 
    Log.i("TESTE", "FILE"); 
    try { 
     FileInputStream fis = context.openFileInput("file_name"+".txt"); 
     BufferedReader r = new BufferedReader(new InputStreamReader(fis)); 
     String line= r.readLine(); 
     r.close(); 
     return line; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.i("TESTE", "FILE - false"); 
     return null; 
    } 
} 
1

Ответ Mintir4 нормально, я бы на нагрузке сделать следующее (для того, чтобы прочитать все строки)

FileInputStream fis = myContext.openFileInput(fn); 
BufferedReader r = new BufferedReader(new InputStreamReader(fis)); 
String s = ""; 
while ((s = r.readLine()) != null) { 
    txt += s; 
} 
r.close(); 
+1

отредактируйте свой ответ и отформатируйте код, чтобы сделать его доступным для чтения – kleopatra

Смежные вопросы