Как переименовать файл во внутреннем хранилище?

У меня есть изображение, которое я взял из альбома пользователя и сохранил в папке.

вот код:

   filename = "pippo.png";

             try {
                    ContextWrapper cw = new ContextWrapper(getApplicationContext());
                    File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);

                    // Create imageDir
                    File myPath = new File(directory,filename);

                    FileOutputStream out = new FileOutputStream(myPath);

                    theImage.compress(Bitmap.CompressFormat.PNG, 90, out);
                    out.flush();
                    out.close();
                    Log.d("Image","saved success");

                   picture =  directory.getAbsolutePath();

                } catch (Exception e) {
                    e.printStackTrace();
                    Log.d("Image","saved failed");

                }

Затем я читаю изображение и меняю его имя этим кодом:

if (comingIntent.hasExtra("FILEPATH"))
                {

                    filePath = comingIntent.getStringExtra("FILEPATH");
                    String filename = "pippo.png";

                    try {
                        File f = new File(filePath, filename);
                        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
                        playerImage.setImageBitmap(b);

                        File newfile = new File(filePath,username+".png");
                        f.renameTo(newfile);
                        Log.d("Image","first load succcess");

                    }
                    catch (FileNotFoundException e)
                    {
                        e.printStackTrace();
                        Log.d("Image","first load failed");

                    }

Но затем, когда я пытаюсь перезагрузить изображение с его новым именем, я получаю исключение file not found, это код:

try {
       File f = new File(filePath, username+".png");
       Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
       playerImage.setImageBitmap(b);

       Log.d("Image","second load succcess");  }

 catch (FileNotFoundException e)
       {
         e.printStackTrace();
         Log.d("Image","second load failed"); }

Это ошибка журнала:

08-09 20:23:50.730 15052-15052/? W/System.err: java.io.FileNotFoundException: lol1.png: open failed: ENOENT (No such file or directory) 08-09 20:23:50.743 15052-15052/? W/System.err:
at libcore.io.IoBridge.open(IoBridge.java:452) at java.io.FileInputStream.(FileInputStream.java:76) at com.example.abzo.socsoc.PlayerHomePage.onCreate(PlayerHomePage.java:103) at android.app.Activity.performCreate(Activity.java:6285) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2414) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2521) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1383) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5517) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) at libcore.io.IoBridge.open(IoBridge.java:438) ... 14 more 08-09 20:23:50.744 15052-15052/? D/Image: second load failed

Вы определили, что файл действительно переименован вашим кодом во внутренней памяти? Хотя это не похоже на вашу проблему при просмотре кода, который вы опубликовали, у меня были проблемы с renameTo () и раньше, когда были внесены правки. А журнал можно предоставить?

ViaTech 09.08.2018 20:42

@ViaTech, это странная часть, папка imageDir, которую я создал, не находится в data> data> my app, я не могу ее найти, хотя она считывала изображение с первой загрузки ... и, конечно, одну секунду.

Abdelrahman Hashim 09.08.2018 20:50

@ViaTech, это путь /data/user/0/com.example.abzo.socsoc/app_imageDir, но как получить к нему доступ? , я не вижу пользователя в данных, когда использую обозреватель устройств

Abdelrahman Hashim 09.08.2018 20:59

Хм .. код, который вы предоставили выше, не кажется полным, поэтому я не могу воссоздать вашу проблему напрямую (по крайней мере, пока), но да, поскольку вы получаете ошибку Данный файл или каталог отсутствует, вы пытаетесь открыть файл, который не существует . Это может произойти по нескольким причинам, которые легко проверить, действительно ли у вас есть доступ к каталогу из проводника, но, поскольку у вас его нет, вам нужно будет устранить неполадки в пути с помощью журналов. Во втором фрагменте кода установите filePath = f.getAbsolutePath () после переименования и Log.d ("Изображение", "успешная первая загрузка");. Это что-нибудь делает?

ViaTech 09.08.2018 21:33

@ViaTech не переименовал, я проверил .. итак, такого файла не было, почему он его не переименовал?

Abdelrahman Hashim 10.08.2018 11:44

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

ViaTech 10.08.2018 17:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
2 038
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

С помощью предоставленного вами кода я создал Основное занятие, который выполняет переименование отмеченного вами файла, который хранился в Внутреннее хранилище (т.е. pippo.png). Успешное переименование подтверждается журналами отладки при запуске Activity.

Примечание: В моем решении ниже я просто создаю файлы и размещаю их там, где вы сказали, что они должны идти, чтобы дать вам ответ о том, как renameTo () следует / можно использовать в вашем приложении, я на самом деле не работаю с изображениями, поскольку вы не предоставили меня с вашим кодом, который вы используете для доступа к изображениям. Я уверен, что вы это понимаете, но вам нужно быть уверенным, что изображение, с которым вы работаете, правильно выбрано пользователем и путь точен, чтобы мой пример работал, когда вы подключаете его к своему реальному приложению.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String imageFilename = "pippo.png";
        //example username, I am not sure how you get this info
        String exampleUsername = "user1";   

        try {
            ContextWrapper cw = new ContextWrapper(getApplicationContext());
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            //check that we are good here...
            if (directory.exists())
                Log.d("ImageTAG", "'imageDir' exists");

            // create imageDir
            File completeImagePath = new File(directory, imageFilename);

            //write file
            FileOutputStream out = new FileOutputStream(completeImagePath);

            out.flush();
            out.close();

            //check to ensure complete image path exists... it should
            if (completeImagePath.exists())
                Log.d("ImageTAG", "'completeImagePath' exists");

            //show full path on device
            Log.d("ImageTAG", "Image saved success, complete Image Path: " +
                    completeImagePath.getAbsolutePath());

            //redeclaration of file here is not needed, but added for clarity
            File from = new File(completeImagePath.getAbsolutePath());
            //what you are renaming the file to
            File to = new File(directory, exampleUsername + ".png");
            //now rename
            Boolean success = from.renameTo(to);

            Log.d("ImageTAG", "Successful Rename: "+success.toString()+"| File is now named: "+to.getPath());

        } catch (Exception e) {
            e.printStackTrace();
            Log.d("ImageTAG","saved failed");
        }

    }
}

Другие вопросы по теме