1

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

这是我用来将信息放入文件的代码,它工作正常:

    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。

PS。变量 bld 是全局的,并在 MainActivity 中定义:

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

谢谢,

4

2 回答 2

1

问题可能出在全局 ArrayList 变量“bld”上。全局定义是可以的,但是在本地初始化。

问题是,您调用 as bld.get(0),但新值附加在它之后。

bld = new ArrayList<String>(); 在“阅读器”功能中添加该行。

于 2013-06-04T15:57:56.270 回答
1

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

fos.close();

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

prntst.close();

关闭打印流将刷新流,然后关闭底层输出流。当您关闭输出流时,它不会知道在其之上构造的打印流的任何信息,因此不知道刷新它。

于 2013-06-04T15:39:45.363 回答