突然无法读/写文件

时间:2017-05-21 20:21:48

标签: java android file

我正在创建一个Android应用程序,它将数据保存到设置活动中的文件中 我制作了一些自定义函数来轻松编写我的文件,它们是我所有活动继承的类,包括设置活动。

自定义功能:

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;
}

设置活动:

@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");
}

有什么奇怪的是,当它凌乱而不是自定义功能时,一切都有效,不知道为什么?

问题似乎发生在ReadFile函数中,其中InputRead.read(inputBuffer)返回-1(文件中没有数据)。
我不知道如何检查问题所在,写入文件或从中读取时......

提前致谢

问题解决了 1. writer.write函数中的ReadFile函数无法打开文件并读取它,因为编写器保持打开状态。
2.同样的ReadFile函数提供了(filename +“。txt”),并且还添加了“.txt”。

2 个答案:

答案 0 :(得分:0)

似乎问题可能出在你如何追加档案......

在内部,您的写入功能会打开文件,然后在关闭之前,您的读取功能会打开相同的文件并关闭它。可能是读取函数在尝试打开文件时失败,因为它已经打开但未关闭。或者可能是当read函数关闭文件时它也会关闭写函数的文件......

所以问题似乎是你想在你的写函数中附加到文件中,但是你实现得很差。您无需将内容重写为文件。您只需找到正确的标志即可打开文件以进行追加。

答案 1 :(得分:0)

您应该使用 java.util.Properties 进行设置。它就像一个Map&lt; String,String&gt;。

要加载所有设置,请使用加载(读者阅读器)

要保存所有设置,请使用保存(OutputStream out,字符串注释)