Инициализировать файл в андроид

Когда пытаюсь создать файл, вылетает исключение, что система только для чтения. В манифесте я указал:

<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. Идею предложил @ЮрийСПБ

→ Ссылка