Estoy creando una aplicación de Android, que guarda datos en un archivo en la actividad de configuración.
Hice algunas funciones personalizadas para facilitar la escritura de mis archivos, están en una clase de la que heredan todas mis actividades, incluida la actividad de configuración.

Funciones personalizadas:

public void WriteToFile(String filename, String tag, String value) {
    try {
        FileOutputStream fileOut = openFileOutput(filename + ".txt", MODE_PRIVATE);
        OutputStreamWriter writer = new OutputStreamWriter(fileOut);
        writer.write(ReadFile(filename + ".txt") + tag + ":" + value + ";");
        writer.close();
    } catch (Exception e) {
        Toast.makeText(this, "ERROR: " + e.toString(), Toast.LENGTH_LONG).show();
        Log.e("Error writing: ", e.toString());
    }
}

public void WipeFile(String filename) {
    try {
        FileOutputStream fileOut = openFileOutput(filename + ".txt", MODE_PRIVATE);
        OutputStreamWriter writer = new OutputStreamWriter(fileOut);
        writer.write("");
        writer.close();
    } catch (Exception e) {
        Toast.makeText(this, "ERROR: " + e.toString(), Toast.LENGTH_LONG).show();
        Log.e("Error writing: ", e.toString());
    }
}

public String ReadFile(String filename) {
    try {
        FileInputStream fileIn = openFileInput(filename + ".txt");
        InputStreamReader InputRead = new InputStreamReader(fileIn);
        char[] inputBuffer = new char[10000];
        String content = "", readString;
        int charRead;
        while ((charRead = InputRead.read(inputBuffer)) > 0) {
            readString = String.copyValueOf(inputBuffer, 0, charRead);
            content += readString;
        }
        InputRead.close();
        return content;
    } catch (Exception e) { WipeFile(filename); return ""; }
}

public String FileValue(String filename, String tag, String defaultValue) {
    String[] content = ReadFile(filename + ".txt").split(";");
    for (String pair : content) {
        if (pair.split(":")[0].equals(tag)) return pair.split(":")[1];
    } WriteToFile(filename, tag, defaultValue); return defaultValue;
}

Actividad de configuración:

@Override
@SuppressWarnings("ConstantConditions")
protected void onCreate(Bundle savedInstanceState) {
    ToolbarTitle = "Settings";
    ActivityID = R.layout.activity_settings;
    ToolbarID = R.id.settings_toolbar;
    ToolbarIcon = R.mipmap.settings_icon;
    ActivityLayout = R.id.settings_layout;
    super.onCreate(savedInstanceState);

    if (prefs.getInt("LoggedinID", 0) == 0) findViewById(R.id.settings_user).setVisibility(View.GONE);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.settings_lowBattery, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    int spinnerPosition = adapter.getPosition(FileValue("settings", "Alert", "20%"));
    Spinner battery = ((Spinner) findViewById(R.id.settings_battery));
    battery.setAdapter(adapter);
    battery.setSelection(spinnerPosition);

    ((Switch) findViewById(R.id.settings_notifications)).setChecked(FileValue("settings", "Notifications", "1").equals("1"));

    findViewById(R.id.settings_ads).setVisibility((FileValue("settings", "Ads", "1").equals("1") ? View.VISIBLE : View.INVISIBLE));
}

@SuppressWarnings("ConstantConditions")
public void Apply(View view) {
    WipeFile("settings");
    WriteToFile("settings", "Notifications", (((Switch) findViewById(R.id.settings_notifications)).isChecked() ? "1" : "0"));
    WriteToFile("settings", "Alert", ((Spinner) findViewById(R.id.settings_battery)).getSelectedItem().toString());
}

public void Ads(View view) {
    Toast.makeText(this, "Just a prank, bro", Toast.LENGTH_SHORT).show();
    WriteToFile("settings", "Ads", "0");
}

Lo extraño es que todo funcionó cuando estaba desordenado y no en funciones personalizadas, ¿alguna idea de por qué?

El problema parece ocurrir en la función ReadFile, donde InputRead.read (inputBuffer) devuelve -1 (No hay datos en el archivo).
No tengo ni idea de cómo verificar dónde se encuentra el problema, al escribir en el archivo o al leerlo ...

Gracias por delante

PROBLEMA RESUELTO
1. La función ReadFile que estaba dentro de la función writer.write no pudo abrir el archivo y leerlo ya que el escritor lo mantuvo abierto para sí mismo.
2. Esa misma función ReadFile se proporcionó con (nombre de archivo + ".txt") y también se le agregó ".txt".

0
Dean Ayalon 21 may. 2017 a las 23:21

2 respuestas

La mejor respuesta

Parece que el problema podría estar en cómo anexas el archivo ...

Internamente, su función de escritura abre el archivo, luego, antes de cerrarlo, su función de lectura abre el mismo archivo y lo cierra. Puede ser que la función de lectura falle cuando intenta abrir el archivo porque ya está abierto, pero no cerrado. O podría ser que cuando la función de lectura cierra el archivo, también cierra el archivo para la función de escritura ...

Entonces, el problema parece ser que desea agregar al archivo en su función de escritura, pero lo está implementando de manera deficiente. No es necesario reescribir el contenido del archivo. Solo necesita encontrar el indicador adecuado para abrir el archivo para agregarlo.

0
bremen_matt 22 may. 2017 a las 07:05

Debes utilizar java.util.Properties para tu configuración. Es como un mapa .

Para cargar todas sus configuraciones, use cargar (Reader reader) .

Para guardar toda la configuración, use guardar (Salida de salida, comentarios de cadena) .

0
modulo 21 may. 2017 a las 23:00