如何以编程方式在android中保存到文件

时间:2015-12-31 04:25:06

标签: android file save

我一直在网上搜索我的答案的解决方案,已经浏览了所有文档,并在发布我自己的问题之前浏览了多个论坛。我需要通过文件保存信息,因为我的功能

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putInt("PointCount", pointCount);
    savedInstanceState.putInt("UpOneCost", upOne);
    savedInstanceState.putInt("UpTwoCost", upTwo);
    savedInstanceState.putInt("TimerTime", upgradeTime);
    super.onSaveInstanceState(savedInstanceState);
    Toast.makeText(this, "Saving", Toast.LENGTH_LONG).show();
}

onSaveInstanceState仅在我不完全清楚的特定时间间隔内工作。但是,我知道当活动被销毁时它不会被调用。上面的函数是mySaveInstanceState函数,下面是我的restoreInstanceState函数

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Toast.makeText(this, "Restoring", Toast.LENGTH_LONG).show();
    if(savedInstanceState != null){
        pointCount = savedInstanceState.getInt("PointCount");
        upOne = savedInstanceState.getInt("UpOneCost");
        upTwo = savedInstanceState.getInt("UpTwoCost");
        upgradeTime = savedInstanceState.getInt("TimerTime");
        if(upgradeTime < 5500){
            startTimer();
        }

        TextView pointCountText = (TextView)findViewById(R.id.myTextView1);
        pointCountText.setText("Points: " + Integer.toString(pointCount));

        TextView pointCountText2 = (TextView)findViewById(R.id.upgradeScreenPointText);
        pointCountText2.setText("Points: " + Integer.toString(pointCount));

        Button upButtonOne = (Button)findViewById(R.id.upButton1);
        upButtonOne.setText("Cost: " + Integer.toString(upOne));

        Button upButtonTwo = (Button)findViewById(R.id.upButton2);
        upButtonTwo.setText("Cost: " + Integer.toString(upTwo));

        TextView myTimerValue = (TextView)findViewById(R.id.myTimerValueText);
        myTimerValue.setText("Current Time: " + Integer.toString(upgradeTime));
    }
}

在那里有一些无用的信息,但是当我点击Android设备上的后退按钮时总体上没有运行,所以经过一些研究后,我决定将它保存到文件目录中。这是我在我的android项目文件中创建了一个名为“saveFile”的文件。它是一个文本文件,它与我的mainActivity.java文件位于同一目录中,以便删除文件范围的复杂性。为了达到这个文件,我得出了覆盖onDestroy()函数并尝试

的结论
String fileName = "saveFile";
FileOutputStream outputStream;

@Override
protected void onDestroy() {
    super.onDestroy();
    outputStream.openFileOutput(fileName, Context.MAKE_PRIVATE);
}

此时我已经停止了,因为它无法找到该文件。文档不清楚这个文件应该在哪里进行目录明智,并且就创建和编写它而言也非常模糊。如果有人能够对所有的工作方式做出非常明确的解释,我将非常感激它。谢谢=)注意一些代码可能包含一些小错误,因为我输入了一些代码而不是复制粘贴,但想法就在那里。我在编辑器中收到的唯一错误是在outputStream.openFileOutput()行上,它表示无法找到该文件。

4 个答案:

答案 0 :(得分:2)

要进行文件操作,您应指定完整的文件路径。 仅传递文件名将抛出FileNotFoundException。

您可以执行以下操作之一; 1.将文件保存在应用缓存中。 filePath = appContext.getCacheDir()。getAbsolutePath()+“yourFileName”;

  1. 将文件保存在app data目录中。 filePath = Environment.getDataDirectory()。getPath()+ File.separator +“data”+ File.separator + appContext.getPackageName()+ File.separator +“yourFileName”;

  2. 将文件保存在SD卡的某个文件夹中。 File sdCard = Environment.getExternalStorageDirectory(); String filePath = sdCard.getAbsolutePath()+ File.separator + BASE_FOLDER_ON_SD_CARD + File.separator +“yourFileName”;

  3. 对于第三个选项,您可能需要在应用程序的AndroidManifest.xml中添加WRITE_EXTERNAL_STORAGE权限。

    此外,保存文件应该在您的活动的onStop()方法中进行,并且读取文件内容应该在onResume()中进行 使用存储位置的文件。

答案 1 :(得分:0)

你可以这样做。

private void writeToFile(String data) {
try {
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("config.txt", Context.MODE_PRIVATE));
    outputStreamWriter.write(data);
    outputStreamWriter.close();
}
catch (IOException e) {
    Log.e("Exception", "File write failed: " + e.toString());
} 
}
private String readFromFile() {

String ret = "";

try {
    InputStream inputStream = openFileInput("config.txt");

    if ( inputStream != null ) {
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String receiveString = "";
        StringBuilder stringBuilder = new StringBuilder();

        while ( (receiveString = bufferedReader.readLine()) != null ) {
            stringBuilder.append(receiveString);
        }

        inputStream.close();
        ret = stringBuilder.toString();
    }
}
catch (FileNotFoundException e) {
    Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
    Log.e("login activity", "Can not read file: " + e.toString());
}

return ret;
}

但是对于每个对象,您必须创建具有不同名称的单独文件。

希望这会对你有帮助..

答案 2 :(得分:0)

下面是在android中存储数据的方法:

  • 共享首选项(数据将一直保留到用户卸载应用程序或在设置应用程序管理器时清除应用程序缓存)
  • sqlite(永久存储)
  • 创建一个要存储的文件(永久存储),或者如果您的数据不需要永久存储,您可以创建一个单例类来存储您的数据。用户关闭应用程序后,存储的数据将消失。

答案 3 :(得分:0)

 public void Save(String fileName) {
    try {
        OutputStreamWriter out = new OutputStreamWriter(openFileOutput(fileName, 0));
        out.write(EditText1.getText().toString());
        out.close();
        Toast.makeText(this, fileName + " saved!", Toast.LENGTH_SHORT).show();
    } catch (Throwable t) {
        Toast.makeText(this, "Exception: " + t.toString(), Toast.LENGTH_LONG).show();
    }
}