Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将列表项保存/加载到文本文件的有效方法_Java_Android_Mobile - Fatal编程技术网

Java 将列表项保存/加载到文本文件的有效方法

Java 将列表项保存/加载到文本文件的有效方法,java,android,mobile,Java,Android,Mobile,大家好,有没有人能有效地将列表视图数组项保存并加载到文本文件中 如何将保存和加载集成到此代码中 我有一些方向,例如保存到文本 File f = File.createTempFile("file", ".txt",Environment.getExternalStorageDirectory ()); FileWriter fw = new FileWriter(f); fw.write(m_listItems); fw.clos

大家好,有没有人能有效地将列表视图数组项保存并加载到文本文件中 如何将保存和加载集成到此代码中

我有一些方向,例如保存到文本

         File f = File.createTempFile("file", ".txt",Environment.getExternalStorageDirectory ());
        FileWriter fw = new FileWriter(f);
        fw.write(m_listItems);
        fw.close();
我所要做的就是能够保存并加载我添加到listview的列表项。如果您有任何帮助,我将不胜感激。我迷路了

提前谢谢你们

public class ListtestActivity extends Activity {
ArrayAdapter<String> m_adapter;
ArrayList<String> m_listItems = new ArrayList<String>();


Button bt;
Button save;
Button Loadtxt;
EditText et;
TextView tv;
ListView lv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 save = (Button) findViewById(R.id.button2);
Loadtxt = (Button) findViewById(R.id.button3);
bt = (Button) findViewById(R.id.button1);
et = (EditText) findViewById(R.id.editText1);
tv = (TextView) findViewById(R.id.textView1);
lv = (ListView) findViewById(R.id.listView1);
m_adapter = new ArrayAdapter<String>   (this,android.R.layout.simple_list_item_1, m_listItems);

 lv.setAdapter(m_adapter);
final String input = et.getText().toString();

bt.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

    String input = et.getText().toString();
    if(null!=input&&input.length()>0){     

    m_listItems.add(input);

    m_adapter.notifyDataSetChanged();

  }

save.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {



  }

 Loadtxt.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {



 }
}
});
公共类ListtestActivity扩展活动{
阵列适配器m_适配器;
ArrayList m_listItems=新建ArrayList();
按钮bt;
按钮保存;
按钮加载文本;
编辑文本;
文本视图电视;
ListView lv;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
保存=(按钮)findViewById(R.id.button2);
Loadtxt=(按钮)findViewById(R.id.button3);
bt=(按钮)findViewById(R.id.button1);
et=(EditText)findViewById(R.id.editText1);
tv=(TextView)findViewById(R.id.textView1);
lv=(ListView)findViewById(R.id.listView1);
m_adapter=new ArrayAdapter(这是android.R.layout.simple_list_item_1,m_list items);
低压设置适配器(m_适配器);
最终字符串输入=et.getText().toString();
bt.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
字符串输入=et.getText().toString();
如果(null!=input&&input.length()>0){
m_listItems.add(输入);
m_adapter.notifyDataSetChanged();
}
save.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
}
Loadtxt.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
}
}
});

试试这个,它可能会对你有所帮助

public  void writeToFile(String fileName)
{
    try {
        final File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/folderName/" );

        if (!dir.exists())
        {
            if(!dir.mkdirs()){
                Log.e("TAG","could not create the directories");
            }
        }

        final File myFile = new File(dir, fileName + ".txt");
        if (!myFile.exists())
            myFile.createNewFile();



        FileWriter writer = new FileWriter(myFile);
        for(String str: m_listItems) {
            writer.write(str);
        }
        writer.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

如果您想要一个快速而健壮的解决方案,您可以使用Java对象序列化。但是,您编写的文件将不再是人类可读的,因为它将以二进制格式存储

我之所以说健壮是因为,今天您使用的是ArrayList。明天如果您想将其更改为ArrayList,您仍然可以使用序列化选项,而无需任何更改来保存和加载对象

如果您希望使用诸如序列化之类的健壮功能,但仍然保持可读性,那么可以使用诸如Gson之类的JSON库,并将内容直接流式传输到文件中

可以非常轻松地将对象序列化为XML格式的存储文件

该库使以逗号分隔或制表符分隔的文件形式读取和写入数据变得容易


搜索堆栈溢出以获取更多讨论和两者的示例。

一种简单的方法是将对象列表转换为字符串,然后在需要时对其进行反序列化。您可以通过以下方式使用Gson:

转换为字符串

Gson gson = new Gson();
List<MyObject> objects = new ArrayList<>();
objects.add(...) //whatever, all your datas to save

String objectsStr = gson.toJson(objects));
//Save you string in a file or in a preference.

您可以将其保存到数据库而不是文件中。请使用[realm for android]()
String objectsStr = ...//get form file or prefs
Gson gson = new Gson();
List<MyObjects> list = new ArrayList< MyObjects >();
list = Arrays.asList(gson.fromJson(objectsStr, MyObjects[].class));
public class MyObject {

    @SerializedName("field1")
    @Expose
    private String filed1;
    @SerializedName("field2")
    @Expose
    private String field1;

}
protected Object bytesToObject(byte[] bytes) throws IOException, ClassNotFoundException {
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    ObjectInputStream ois = new ObjectInputStream(bais);
    Object ret= ois.readObject();
    ois.close();
    return ret;
}

protected byte[] objectToBytes(Serializable object) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(object);
    oos.close();
    return baos.toByteArray();
}