读取和写入文本文件的错误

时间:2013-06-04 15:19:38

标签: java android text-files textfield read-write

我正在开发一个应用程序,其中用户在某些文本字段中放置一些数字信息,应用程序应该将信息写入txt文件供以后使用,例如下次打开应用程序或刷新按钮按下数字应该从文件中读取并加载到相同的文本字段中,以便用户可以根据需要更改它们。虽然“编写器”和“加载器”功能似乎都在工作,但问题是每次调用“加载器”时,它都会加载来自某些先前保存的文件的数据,而不是“编写器”现在创建的文件。 ”。如果用户希望将新保存的数据加载到文本字段中,则需要关闭并再次重新打开应用程序。为了更好地解释这种情况,我在代码之后放了一些场景。任何想法有什么不对,可以做些什么?

以下是我用来将信息放入文件的代码,它运行正常:

    public void writer(View view){                               
    try {

        FileOutputStream fos = openFileOutput("myfilename", Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);
        PrintStream prntst = new PrintStream(fos);
        txtEditor=(EditText)findViewById(R.id.editText1);
        prntst.println (txtEditor.getText().toString());
        txtEditor=(EditText)findViewById(R.id.EditText02);
        prntst.println (txtEditor.getText().toString());   
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }       
}

这是我用来从文件中读取信息到某些ArrayList的代码,然后这个ArrayList用于填充文本字段,这也很好(精确意味着没有错误):

    public void reader(View view){
    try {

        BufferedReader inputReader = new BufferedReader(new InputStreamReader(openFileInput("myfilename")));            
        Scanner scanner = new Scanner(inputReader);     
        while (scanner.hasNextLine()) {             
              String line = scanner.nextLine();
              bld.add(line);
            }

        inputReader.close();
        scanner.close();
        txtEditor=(EditText)findViewById(R.id.editText1);
        txtEditor.setText(bld.get(0));          
        txtEditor=(EditText)findViewById(R.id.EditText02);
        txtEditor.setText(bld.get(1));


    } catch (IOException e) {
        e.printStackTrace();            
        txtEditor=(EditText)findViewById(R.id.editText1);
        bld.add((txtEditor.getText().toString()));
        txtEditor=(EditText)findViewById(R.id.EditText02);
        bld.add((txtEditor.getText().toString()));           
    }
}

情景:

  1. 用户打开应用程序,文本字段(两个文本字段)中有一些默认值,用户分别将值更改为2和3,然后触摸保存按钮。
  2. 用户再次更改值但不是触摸保存按钮而是点击加载按钮,现在应用程序应该将2和3加载到字段(已保存)中,而是加载默认值。
  3. 用户关闭应用并重新打开它们,此时2和3在文本字段中显示为默认值。好像“装载机”现在正在读取先前保存的文件中的数据。
  4. 用户将值从“2和3”更改为“13和14”并分别点击保存和加载按钮,但是将2和3加载到字段中。
  5. 用户关闭并重新打开应用程序,此时显示13和14。
  6. PS。变量bld是全局的,并在MainActivity中定义:

        ArrayList<String> bld = new ArrayList<String>();
    

    谢谢,

2 个答案:

答案 0 :(得分:1)

在writer方法中,您正在关闭文件输出流:

fos.close();

但你肯定应该关闭打印流。

prntst.close();

关闭打印流将刷新流,然后关闭基础输出流。当你关闭输出流时,它不会知道有关在它上面构造的打印流的任何信息,所以不知道要刷新它。

答案 1 :(得分:1)

问题可能在于全局ArrayList变量'bld'。可以全局定义它,但可以在本地初始化它。

问题在于,您正在调用bld.get(0),但新值会附加在其后面。

添加第bld = new ArrayList<String>();行 在你的“读者”功能中。