Инициализировать файл в андроид
Когда пытаюсь создать файл, вылетает исключение, что система только для чтения. В манифесте я указал:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
И студия мне подчёркивает: WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 10+
Код метода с исключением:
path = String.valueOf(R.string.path_to_save); // "info.txt"
FileInputStream inputStream = null;
try {
File jsonData = new File(path);
if (!jsonData.exists()) {
jsonData.createNewFile(); //здесь ошибка
}
inputStream = new FileInputStream(jsonData);
InputStreamReader streamReader = new InputStreamReader(inputStream);
BufferedReader bufferedStream = new BufferedReader(streamReader);
Gson gson = new Gson();
String text = bufferedStream.readLine();
HandlersHandler handler = gson.fromJson(text,HandlersHandler.class);
this.tasks = handler.getTasks();
this.values = handler.getValues();
}
catch(IOException ex) {
ex.printStackTrace();
}
finally{
try{
if(inputStream!=null)
inputStream.close();
}
catch(IOException ex){
//Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
код ошибки:
W/System.err: java.io.IOException: Read-only file system
W/System.err: at java.io.UnixFileSystem.createFileExclusively0(Native Method)
W/System.err: at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:281)
at java.io.File.createNewFile(File.java:1013)
at com.example.mytraningapplication.HandlersHandler.load(HandlersHandler.java:56)
W/System.err: at com.example.mytraningapplication.MainActivity$4.onClick(MainActivity.java:94)
at android.view.View.performClick(View.java:6715)
W/System.err: at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:6673)
W/System.err: at android.view.View.access$3400(View.java:797)
W/System.err: at android.view.View$PerformClick.run(View.java:26449)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:7212)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
Ответы (1 шт):
Автор решения: виктор чернов
→ Ссылка
Я неправильно обращался к файлу. Строка path должна иметь значение: getFilesDir() + path. Например:
path = getFilesDir() + "@\src\main\java\com\example\myexampleapplication\info.txt";
File example = new File(path);
либо можно определять файл как:
File example = new File(getFilesDir(), path);
// path = "\src\main\java\com\example\myexampleapplication\info.txt"
строка path - полный путь от папки src(включительно) до необходимого файла.
P.S. Идею предложил @ЮрийСПБ