Внутренняя память Android не сохраняет файл

У меня есть основное действие, и при нажатии на элемент списка он запускает новое действие по намерению. Тема этого нового действия — диалоговое окно (поэтому кажется, что второе действие плавает над основным действием).

В этом новом действии я ввожу некоторые данные в EditTexts, затем с этими данными я создаю пользовательский объект и пытаюсь сохранить его во внутренней памяти.

кажется, он не создает файл. Я не могу понять, почему это не работает, поскольку я использую ту же структуру с другими объектами в других действиях, и она работает правильно. Вот что заставляет меня думать, что это должно быть как-то связано с тем фактом, что тема этой активности — Диалог. Пользовательский класс объектов, очевидно, реализует Serializable, и у меня есть все разрешения в моем манифесте Android. Возможно, проблема связана с контекстом, который я передаю методу сохранения (getApplicationContext()).

Это тема Activity with the Dialog:

package es.lagoacunado.lagoacunadoconsutores;

import java.io.File;

import utilidades.SeriaPreferencias;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import clases.Preferencia;

public class Preferencias extends Activity {

    EditText ftpDir, ftpUser, ftpPass;
    Button btnGuardar, btnCancelar;

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

        this.setFinishOnTouchOutside(false);

        ftpDir = (EditText) findViewById(R.id.ftpDIR);
        ftpUser = (EditText) findViewById(R.id.ftpUSER);
        ftpPass = (EditText) findViewById(R.id.ftpPASS);
        btnGuardar = (Button) findViewById(R.id.btnGuardar);
        btnCancelar = (Button) findViewById(R.id.btnCancelar);

        File filePref = new File("preferencias.dat");
        if (filePref.exists()) {
            /*
             * ftpDir.setText(SeriaPreferencias.cargarPreferencias(
             * getApplicationContext()).getDirFTP());
             * ftpUser.setText(SeriaPreferencias.cargarPreferencias(
             * getApplicationContext()).getUsrFTP());
             * ftpPass.setText(SeriaPreferencias.cargarPreferencias(
             * getApplicationContext()).getPssFTP());
             */
            Preferencia loadPref = SeriaPreferencias
                    .cargarPreferencias(getApplicationContext());
            ftpDir.setText(loadPref.getDirFTP());
            ftpUser.setText(loadPref.getUsrFTP());
            ftpPass.setText(loadPref.getPssFTP());
        }

        btnGuardar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String dir, usr, pss;
                dir = ftpDir.getText().toString();
                usr = ftpUser.getText().toString();
                pss = ftpPass.getText().toString();

                //Log.d("PRUEBA Guardar Preferencias", "dir= "+dir+" -- user= "+usr+" -- pss= "+pss);

                Preferencia pref = new Preferencia(dir, usr, pss);
                // METHOD THAT SAVES THE OBJECT pref
                SeriaPreferencias.guardarPreferencias(getApplicationContext(),
                        pref);

                File prueba = new File("preferencias.dat");
                if(prueba.exists()){
                    Log.d("-->PRUEBA", "EL ARCHIVO EXISTE");
                }

                finish();
            }
        });

        btnCancelar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

}

Это класс с методами сохранения и загрузки:

package utilidades;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.content.Context;
import android.util.Log;
import clases.Preferencia;

public class SeriaPreferencias {

    private static String FICHERO = "preferencias.dat";

    public static void guardarPreferencias(Context context, Preferencia prefs) {

        try {
            FileOutputStream fos = context.openFileOutput(FICHERO,
                    Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            oos.writeObject(prefs);

            oos.close();
            fos.close();

        } catch (Exception e) {
            Log.e("MiCV", e.getMessage(), e);
        }
    }

    public static Preferencia cargarPreferencias(Context context) {
        Preferencia prefs = null;

        try {

            FileInputStream fis = context.openFileInput(FICHERO);
            ObjectInputStream ois = new ObjectInputStream(fis);

            prefs = (Preferencia) ois.readObject();

            ois.close();
            fis.close();

        } catch (Exception e) {
            Log.e("MiCV", e.getMessage(), e);
        }

        return prefs;
    }

}

а это пользовательский класс объектов:

package clases;

import java.io.Serializable;

public class Preferencia implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String dirFTP, usrFTP, pssFTP;

    public Preferencia() {

    }

    public Preferencia(String dirFTP, String usrFTP, String pssFTP) {
        this.dirFTP = dirFTP;
        this.usrFTP = usrFTP;
        this.pssFTP = pssFTP;
    }

    public String getDirFTP() {
        return dirFTP;
    }

    public void setDirFTP(String dirFTP) {
        this.dirFTP = dirFTP;
    }

    public String getUsrFTP() {
        return usrFTP;
    }

    public void setUsrFTP(String usrFTP) {
        this.usrFTP = usrFTP;
    }

    public String getPssFTP() {
        return pssFTP;
    }

    public void setPssFTP(String pssFTP) {
        this.pssFTP = pssFTP;
    }

}

person jacho981    schedule 13.05.2014    source источник
comment
Как определить, что файл не сохраняется? Что делать, если что-то вы видите в своем журнале? Что-нибудь из ваших ловушек? Как насчет того, чтобы вставлять сообщения, которые дают частичные отчеты о прогрессе при попытке сохранения, сообщают вам, где был создан файл и т. д.   -  person Chris Stratton    schedule 13.05.2014
comment
потому что у меня есть это предложение IF сразу после метода сохранения, и если файл существует, он должен показать log.d, подтверждающий это.File prueba = new File("preferencias.dat"); if(prueba.exists()){ Log.d("-->PRUEBA", "EL ARCHIVO EXISTE"); }   -  person jacho981    schedule 13.05.2014
comment
проблема должна быть в методе сохранения SeriaPreferencias.guardarPreferencias(getApplicationContext(), pref); или в контексте, который я передаю этому методу.   -  person jacho981    schedule 13.05.2014


Ответы (1)


 File filePref = new File("preferencias.dat");

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

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

Чтобы создать файловый объект, указывающий на тот же файл в частной области хранения вашего приложения, из класса Activity или другого допустимого контекста, во время или после его метода onCreate() вы можете использовать:

File filePref = new File(getFilesDir(), "preferencias.dat");

Потому что Context.getFilesDir() ссылается на то же расположение личной папки, что и Context.openFileOutput().

person Chris Stratton    schedule 13.05.2014
comment
Я не использую конструктор File() для создания файла. Файл создается SeriaPreferencias.guardarPreferencias(). Я использую конструктор файлов, чтобы ПРОВЕРИТЬ, существует ли файл. И я не согласен со второй частью вашего ответа. Как я уже сказал в своем вопросе, я уже использую ту же структуру для сохранения файлов во внутренней памяти, И ЭТО РАБОТАЕТ, поэтому еще раз проблема должна заключаться в контексте, который я передаю из-за того, что тема Dialog настроена на это действие. - person jacho981; 13.05.2014
comment
Если у вас недопустимый контекст, вы должны увидеть сообщение из своего оператора журнала или что-то из системного обработчика исключений. И нет, вы, по-видимому, не выполняете проверку существования после вашего метода сохранения - вы вызываете его в onCreate() своей активности. Кроме того, необходимо решить проблему с невозможностью указать допустимый путь к конструктору File(), используемому для проверки существования. - person Chris Stratton; 13.05.2014
comment
нет, тот, что в onCreate(), должен проверить, существует ли файл, и если он существует, то загрузить данные, содержащиеся в файле, в EditTexts. Если вы продолжите читать код, вы увидите OnClickListener, и именно здесь я вызываю метод сохранения. - person jacho981; 13.05.2014
comment
Вы по-прежнему неправильно используете конструктор File() с недопустимым путем. - person Chris Stratton; 13.05.2014
comment
почему -1 для? Я не злоупотребляю конструктором file(), так как я говорю вам, что он работает в других подобных случаях, и единственная разница между этим случаем и другими заключается в теме диалога. - person jacho981; 13.05.2014
comment
Опубликовать вывод журнала filePref.getAbsolutePath() - person Chris Stratton; 13.05.2014
comment
там написано /preferencias.dat - person jacho981; 13.05.2014
comment
Да, как я уже говорил вам в течение некоторого времени, это не путь, по которому вы можете писать, что происходит из-за неправильного использования конструктора. Получите допустимый путь и используйте конструктор с двумя аргументами, как показано в этом ответе. Context.getFilesDir() задокументирован для получения местоположения, используемого Context.openFileOutput(). - person Chris Stratton; 13.05.2014
comment
но я создаю файл, используя FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);. разве это не метод, используемый для внутреннего хранения? - person jacho981; 13.05.2014
comment
Конечно, вы создаете его разумно. Но когда вы пытаетесь проверить его, вы проверяете его в корневом каталоге телефона, а не в личном каталоге вашего приложения, где вы его создали. Прекратите неправильно использовать конструктор File() - передайте ему фактический каталог, а также имя файла, и тогда вы сможете проверить, действительно ли файл существует в этом вероятном месте. - person Chris Stratton; 13.05.2014
comment
Вы совершенно правы. могу ли я смешивать его с java? потому что в java я создаю файлы в том же каталоге, где находится файл .jar, поэтому, возможно, я все перепутал. Плюс, возможно, разговор на английском может иногда сбивать меня с толку. Большое спасибо. PS: не могли бы вы удалить -1? просто интересуюсь... - person jacho981; 13.05.2014