11

I have an ArrayList full of strings that the user populated it with to use in a different activity in a ListView to view the strings they have saved. I want the ArrayList they populated to be saved but I am so lost on how to get it to work. I've tried FileOutputStream, SharedPreferences. I looked at many examples.

for example i have

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

and to save the arraylist ive tried stuff like

FileOutputStream fos = openFileOutput(MYFILENAME, Context.MODE_PRIVATE);
fos.write(give.getBytes());
fos.close();

but this does not work at all

John Conde
  • 217,595
  • 99
  • 455
  • 496
NightSkyCode
  • 1,141
  • 2
  • 16
  • 33
  • Have you tried to serialize the Array and write it to file? I've done this. What version of android? as the latest now has ways to save Array to preferences – JPM Jul 24 '12 at 22:18
  • the newer versions of android, 2.3.6 for example. and that sounds interesting I havent heard of that – NightSkyCode Jul 24 '12 at 22:26
  • So the answer below won't work for you...Save ArrayList to SharedPreferences as this came out for 3.0. Let me know if you need a Serializable class I have one for jsut this sorts. – JPM Jul 24 '12 at 22:49

2 Answers2

22

Here is some code to take a serializable object and write it to file, this maybe what you need. Tested it out with and ArrayList and it works fine. You can also modify the output and instead of writing it to file you can pass it to an activity using extras or its bundle. I used this method for android versions < 3.0.

To Read a file already containing serialized object:

String ser = SerializeObject.ReadSettings(act, "myobject.dat");
if (ser != null && !ser.equalsIgnoreCase("")) {
    Object obj = SerializeObject.stringToObject(ser);
    // Then cast it to your object and 
    if (obj instanceof ArrayList) {
        // Do something
        give = (ArrayList<String>)obj;
    }
}

To Write an object to file use:

String ser = SerializeObject.objectToString(give);
if (ser != null && !ser.equalsIgnoreCase("")) {
    SerializeObject.WriteSettings(act, ser, "myobject.dat");
} else {
    SerializeObject.WriteSettings(act, "", "myobject.dat");
}

Class to serialize an object:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;

import android.content.Context;
import android.util.Base64InputStream;
import android.util.Base64OutputStream;
import android.util.Log;

/**
 * Take an object and serialize and then save it to preferences
 * @author John Matthews
 *
 */
public class SerializeObject {
    private final static String TAG = "SerializeObject";

    /**
     * Create a String from the Object using Base64 encoding
     * @param object - any Object that is Serializable
     * @return - Base64 encoded string.
     */
    public static String objectToString(Serializable object) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            new ObjectOutputStream(out).writeObject(object);
            byte[] data = out.toByteArray();
            out.close();

            out = new ByteArrayOutputStream();
            Base64OutputStream b64 = new Base64OutputStream(out,0);
            b64.write(data);
            b64.close();
            out.close();

            return new String(out.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Creates a generic object that needs to be cast to its proper object
     * from a Base64 ecoded string.
     * 
     * @param encodedObject
     * @return
     */
    public static Object stringToObject(String encodedObject) {
        try {
            return new ObjectInputStream(new Base64InputStream(
                    new ByteArrayInputStream(encodedObject.getBytes()), 0)).readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Save serialized settings to a file
     * @param context
     * @param data
     */
    public static void WriteSettings(Context context, String data, String filename){ 
        FileOutputStream fOut = null; 
        OutputStreamWriter osw = null;

        try{
            fOut = context.openFileOutput(filename, Context.MODE_PRIVATE);       
            osw = new OutputStreamWriter(fOut); 
            osw.write(data); 
            osw.flush(); 
            //Toast.makeText(context, "Settings saved",Toast.LENGTH_SHORT).show();
        } catch (Exception e) {       
            e.printStackTrace(); 
           // Toast.makeText(context, "Settings not saved",Toast.LENGTH_SHORT).show();
        } 
        finally { 
            try { 
                if(osw!=null)
                    osw.close();
                if (fOut != null)
                    fOut.close(); 
            } catch (IOException e) { 
                   e.printStackTrace(); 
            } 
        } 
    }

    /**
     * Read data from file and put it into a string
     * @param context
     * @param filename - fully qualified string name
     * @return
     */
    public static String ReadSettings(Context context, String filename){ 
        StringBuffer dataBuffer = new StringBuffer();
        try{
            // open the file for reading
            InputStream instream = context.openFileInput(filename);
            // if file the available for reading
            if (instream != null) {
                // prepare the file for reading
                InputStreamReader inputreader = new InputStreamReader(instream);
                BufferedReader buffreader = new BufferedReader(inputreader);

                String newLine;
                // read every line of the file into the line-variable, on line at the time
                while (( newLine = buffreader.readLine()) != null) {
                    // do something with the settings from the file
                    dataBuffer.append(newLine);
                }
                // close the file again
                instream.close();
            }

        } catch (java.io.FileNotFoundException f) {
            // do something if the myfilename.txt does not exits
            Log.e(TAG, "FileNot Found in ReadSettings filename = " + filename);
            try {
                context.openFileOutput(filename, Context.MODE_PRIVATE);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            Log.e(TAG, "IO Error in ReadSettings filename = " + filename);
        }

        return dataBuffer.toString();
    }

}
JPM
  • 9,077
  • 13
  • 78
  • 137
  • Sorry forgot to add the imports for it import android.util.Base64InputStream; import android.util.Base64OutputStream; – JPM Jul 25 '12 at 22:11
  • 1
    OH! i had my build target to low. I fixed it. your answer worked great for me! Much thanks! – NightSkyCode Jul 26 '12 at 03:23
  • I did not find this solution reliable as I would frequently get exceptions on the `.readObject()` line. This solution is much cleaner and I haven't had any problems with it (except it is notably slower): http://stackoverflow.com/a/16111797/1617737 – ban-geoengineering Nov 07 '16 at 02:18
5

You could use SharedPreferences there is an example below link

Save ArrayList to SharedPreferences

Community
  • 1
  • 1
Tuna Karakasoglu
  • 1,262
  • 9
  • 28