Сохранить внутренний файл в моей собственной внутренней папке на 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();
}
Ответы
Ответ 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();