将 ArrayList 保存到 android 上的文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11640122/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Save an ArrayList to File on android
提问by NightSkyCode
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.
我有一个充满字符串的 ArrayList,用户填充它以在 ListView 中的不同活动中使用以查看他们保存的字符串。我希望他们填充的 ArrayList 被保存,但我对如何让它工作感到迷茫。我试过 FileOutputStream、SharedPreferences。我看了很多例子。
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
但这根本不起作用
回答by JPM
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.
这是一些用于获取可序列化对象并将其写入文件的代码,这可能是您需要的。使用 ArrayList 对其进行了测试,效果很好。您还可以修改输出,而不是将其写入文件,您可以使用 extras 或其包将其传递给活动。我将这种方法用于 <3.0 的 android 版本。
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();
}
}
回答by Tuna Karakasoglu
You could use SharedPreferencesthere is an example below link
您可以使用SharedPreferences下面有一个示例链接