Подтвердить что ты не робот

Сохранить внутренний файл в моей собственной внутренней папке на Android

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

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

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

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

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

в Manifest.xml, который не требуется для внутренней памяти.

Нет необходимости говорить, что у меня нет проблем с сохранением файлов в пути /data/data/package/files, но когда я добавляю свою папку в корневой каталог файлов, например /data/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();                    
    }
4b9b3361

Ответ 1

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

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

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

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

Третий способ:

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

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

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

Пятый путь:

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

Правильный способ:

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

Ответ 2

Сохранить

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

Load:

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

Ответ 3

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

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