如何从文本文件中读取数据然后用新数据覆盖它?

时间:2016-01-10 18:12:51

标签: java android android-studio

我是android studio的新手,我有这个textview,显示存储到我的文本文件的数据。如果我单击该按钮,它应该读取文本文件中的数据,添加整数,总和应该替换文本文件中的现有数据。但是,当我返回显示文本文件中带有新数据的textView的活动时,它不会改变。

这是我的textView

的代码
        txt_stars = (TextView) findViewById(R.id.txtStars);

        try {
            FileInputStream fileInputStream = openFileInput("Stars.txt");
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            StringBuffer stringBuffer = new StringBuffer();
            String star;
            while ((star=bufferedReader.readLine()) != null){
                stringBuffer.append(star);
            }
            txt_stars.setText(stringBuffer.toString());
        }
        catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

按钮的代码

Integer stars, totalStars;


public void onClick(DialogInterface dialog, int whichButton) {

  try {
    FileInputStream fileInputStream = openFileInput("Stars.txt");
    InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    StringBuffer stringBuffer = new StringBuffer();
    String star;
    while ((star = bufferedReader.readLine()) != null) {
      stringBuffer.append(star);
    }
    stars = Integer.parseInt(stringBuffer.toString());
    totalStars = stars + 50;
    //is this acceptable?
    FileOutputStream fileOutputStream = openFileOutput("Stars.txt", MODE_PRIVATE);
    fileOutputStream.write(totalStars.toString().getBytes());
    fileOutputStream.close();

  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }

  Intent nextForm = new Intent(".MainActivity");
  startActivity(nextForm);
}

而且,我在哪里可以找到手机中创建的文本文件,以便确保创建文本文件?我正在使用Android studio 1.5.1并将应用程序运行到我的手机上。

我的清单文件中有这个。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我有什么办法找到并创建文本文件吗?

我被困在这里好几天了。请帮我。 非常感谢!

2 个答案:

答案 0 :(得分:2)

这可能是因为您在保存方法中读取文件时FileNotFoundException。当您尝试更新文件并写入文件时,不要将try/catch方法分开,以免在读取部分出现异常,从而阻止继续执行脚本并更新文件。也许这是在Logcat中打印但你还没看看 因此,我建议您检查文件是否已存在并分开读/写部分。

当您第一次阅读该文件以在TextView中显示该文件时,只需检查它是否已创建以避免出现后台异常:

File f = new File(getFilesDir().toString() + "/stars.txt");
Log.v("", "Does the file exist? " + f.exists()); 
if (f.exists()) {
    readFile();
}

您可以在此处查看应存储文件的位置(在getFilesDir()中)。默认情况下,当您使用openFileInput(String)时会选择路径,并且它是:

  

数据/数据/ com.package.name /文件/

您必须记住,您实际上并未在代码中创建/files文件夹,例如,我必须自己创建它才能使用上述方法。 (这可能只是我的设备,但您要注意这可能会阻止创建文件。)

现在,您的阅读方法没有太大的变化,这就是它的外观:

private void readFile() {
    try {
        FileInputStream file = openFileInput("stars.txt");
        InputStreamReader inRead = new InputStreamReader(file);
        BufferedReader buffReader = new BufferedReader(inRead);

        StringBuffer stringBuffer = new StringBuffer();
        String star;

        while ((star = buffReader.readLine()) != null) {
            stringBuffer.append(star);
        }

        inRead.close();
        file.close();

        txt_stars.setText(stringBuffer.toString());
    } catch (Exception e) {
        Log.e("ReadFile", e.toString());
    }
}

显然,只有在上一次检查返回true时才会调用此方法。单击Button时必须执行相同操作:检查是否存在 - &gt;如果是的话,获取内容,做你的东西(添加,总和等)并写入其中 - &gt;如果没有,只需通过写入就可以创建它 以下内容将起作用:

public void writeFile(View v) {
    File f = new File(getFilesDir().toString() + "/stars.txt");
    Log.v("", "Does it exist? " + f.exists());
    String result = "";

    if ( f.exists() ) {
       try {
            FileInputStream file = openFileInput("stars.txt");
            InputStreamReader inRead = new InputStreamReader(file);
            BufferedReader buffReader = new BufferedReader(inRead);
            StringBuffer stringBuffer = new StringBuffer();

            String star;

            while ((star=buffReader.readLine()) != null) {
                stringBuffer.append(star);
            }

            result = stringBuffer.toString();
            inRead.close();
            file.close(); 
        } catch (Exception e) {
            Log.e("WriteFile", "--- Error on reading file: "+e.toString());
        }
    } else {
        // get the user's star or whatever
        result = editRating.getText().toString();
    }

    Log.v("WriteFile", "--- Read file returns: " + result);
    stars = Integer.parseInt(result);
    totalStars = stars + 50;

    try {         
        FileOutputStream fileOut = openFileOutput("stars.txt", MODE_PRIVATE);
        OutputStreamWriter outputWriter = new OutputStreamWriter(fileOut);
        outputWriter.write(String.valueOf(totalStars));
        outputWriter.close();
        fileOut.close();

        // display file saved message
        Toast.makeText(getBaseContext(), "File saved", Toast.LENGTH_SHORT).show();
     } catch (Exception e) {
         Log.e(" WriteFile", e.toString());
     }
}

此时,当您返回上一个活动时,您应该能够看到更改。

但是,为了查看存储中的文件,遗憾的是您必须拥有root设备,否则为you'll see an empty folder。最后,您要避免重新启动活动。您应该完成编辑,这将返回上一个,您只需在readFile()而不是onResume()中拨打onCreate()。它会将新内容更新为TextView

答案 1 :(得分:0)

您是否在开始新活动之前尝试更新textview?例如:

txt_start.setText(""+totalStars);