Domiurg
Domiurg

Reputation: 15

Can not write more than 1 line into file

I am trying to write to a text file a list of names. It is written one line at a time and I have a class for Writing to File and Reading from it. Here is the class:

package com.example.mobiledayoff;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

import android.content.Context;

public class userListIO {

Context fileContext;

public userListIO(Context fileContext){
    this.fileContext=fileContext;
}

public void writeItems(String fileName, String name){
    final String ls = System.getProperty("line.separator");
    BufferedWriter writer = null;
    try{
        writer = 
            new BufferedWriter(new OutputStreamWriter(fileContext.getApplicationContext().openFileOutput(fileName, Context.MODE_PRIVATE)));
        writer.write(name + ls);
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public ArrayList<CharSequence> readItems(String filename){
    ArrayList<CharSequence> list = new ArrayList<CharSequence> ();
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(fileContext.getApplicationContext().openFileInput(filename)));
        String line;

        while((line = br.readLine()) != null){
            list.add(line);
        }
    } catch (Exception e) {
         e.printStackTrace();
      } finally {
      if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
                e.printStackTrace();
            }
        }
      }

    return list;
}

}

I use this class to write a line from user input (EditText) to the file. And then I read from file and Display contents of the file in another EditText. Here is how I do it:

public void addUser(View view){
    EditText text = new EditText(this);
    text = (EditText)findViewById(R.id.add_user_text);
    String name = text.getText().toString();        
    String filename = "userList.txt";

    userListIO messenger = new userListIO(this);

    messenger.writeItems(filename, name);

    text.setText("");

    ArrayList<CharSequence> list = messenger.readItems(filename);

    EditText editText = (EditText) findViewById(R.id.debug_text);

    String info = "";
    int count = 0;
    for (CharSequence item: list){
        info += item.toString();
        count++;
    }

    info += "; there are " + count + " lines";

    editText.setText(info);
}

My main problem is that it seems that file gets overwritten each time I write into it and so I always have 1 line. Do you guys know how to fix this? By fix I mean: How to append to the file if it already exists or create one if it doesn't exist.

Also I found out that after I close and reopen an app, the file does not exist. How to create and save a file, so that after closing and reopening I could still use the data stored there?

p.s. Read/Write was taken from here: The best way to store user input data for later work

Upvotes: 0

Views: 85

Answers (1)

Marco de Abreu
Marco de Abreu

Reputation: 663

Change

new BufferedWriter(new OutputStreamWriter(fileContext.getApplicationContext().openFileOutput(fileName, Context.MODE_PRIVATE)));

to

new BufferedWriter(new OutputStreamWriter(fileContext.getApplicationContext().openFileOutput(fileName, Context.MODE_PRIVATE | Context.MODE_APPEND)));

This will combine the MODE_PRIVATE flag aswell as the MODE_APPEND flag.

P.S. You should get away from opening and closing a stream everytime you write a line. This produces a lot of overhead and rather should you try to keep the stream opened until all your data has been processed.

Upvotes: 3

Related Questions