java - 在android中读取和写入序列化对象

标签 java android serialization

我一直在这里搜索,但似乎找不到有效的方法。我正在尝试将一个简单的对象列表写入序列化文件,但似乎无法在 android 中找到该文件。这是我第一次构建应用程序,我通过指向 src/list.ser 在 netbeans 中工作,但是,这在 android studio 中不起作用。我想我的问题是我应该在哪里放置 ser 文件以及如何在代码中指向它?这是我的代码:

列表 Activity :

 public class ListActivity extends Activity implements Serializable {

    private ArrayList<Item> list;

    public List() throws Exception {
        list = new ArrayList<Item>();
    }

    public void addItem(String name) {
        list.add(new Item(name));

    }

    public void addCurrentList() throws Exception{

        String pathToAppFolder = getExternalFilesDir(null).getAbsolutePath();
        String filePath = pathToAppFolder +File.separator + "list.ser";

        try {
            ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filePath));



            os.writeObject(list);
            os.close();
        }
        catch (Exception e) {

            System.out.println("NOPE NOPE NOPE NOPE");


        }
    }



    public void addItem(String name, int price) {
        list.add(new Item(name, price));
    }

    public ArrayList<Item> populate() {
        return list;
    }
    public void record() {

        try {

            ObjectInputStream in = new ObjectInputStream(new FileInputStream("src/list.ser"));
            ArrayList<Item> list2 = (ArrayList<Item>) in.readObject();
            System.out.println(list2);
            list = list2;

            in.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

}

主要 Activity :

 public class MainActivity extends AppCompatActivity {



    private List tester;
    private ListView lv;
    private EditText gg;
    private Button button;
    private Button clearButton;
    private ArrayList list;
    String pathToAppFolder = getExternalFilesDir(null).getAbsolutePath();
    String filePath = pathToAppFolder + File.separator + "list.ser";

    @Override
    protected void onDestroy() {

        try {
            tester.addCurrentList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onDestroy();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //create the list

        lv = (ListView) findViewById(R.id.listDisplay);
        ListView mine = lv;
        list = new ArrayList<String>();

        try {
            tester = new List();
        }
        catch (Exception e) {

        }




        for (Item item : tester.populate()) {
            list.add(item);
        }

        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);

        lv.setAdapter(arrayAdapter);

        final TextView firstTextView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        clearButton = (Button) findViewById(R.id.clear);

        gg = (EditText) findViewById(R.id.item);

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                String no = gg.getText().toString();
                if (!no.isEmpty()) {
                    tester.addItem(no);
                    arrayAdapter.add(no);
                    arrayAdapter.notifyDataSetChanged();
                    gg.setText("");

                }

            }
        });

        clearButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                arrayAdapter.clear();
                arrayAdapter.notifyDataSetChanged();
            }
        });


        lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String item = lv.getItemAtPosition(position).toString();

                arrayAdapter.remove(arrayAdapter.getItem(position));
                arrayAdapter.notifyDataSetChanged();
            }
        });

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

}

最佳答案

首先确保您有写入外部存储的权限。

作为,

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

您可以使用,

  public void addCurrentList() throws Exception{

            String pathToAppFolder = getExternalFilesDir(null).getAbsolutePath();
            String filePath = pathToAppFolder +File.seperator + "list.ser";
            try {
                ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filePath));
                os.writeObject(list);
                os.close();
            }
            catch (Exception e) {
                System.out.println("");
            }
        }

并使用它创建一个文件路径,

String filePath = pathToAppFolder +File.seperator + "Test.text";

然后无论您想在哪里再次读取该文件,都可以重新创建路径。因为您可以从 android 代码访问上下文

编辑

您无法像在代码中那样访问上下文。您可以在 onCreate 方法中执行此操作。我只添加了必要的部分。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pathToAppFolder = getExternalFilesDir(null).getAbsolutePath();
        filePath = pathToAppFolder + File.separator + "list.ser";
        //create the list

天哪,我不得不费尽心思来回答你的问题。就是这样,您的 List 类不是应用程序中的 Activity。这只是一个类。所以我建议你先删除这些继承。删除此扩展 Activity。我建议您将 List 类名称更改为其他名称。因为,List 是一个定义的关键字,这样做不是最佳实践。

将List Activity中的方法更改如下。

    public void addCurrentList(String filePath) throws Exception

            try {
                ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filePath));



                os.writeObject(list);
                os.close();
            }
            catch (Exception e) {

                System.out.println(e.getMessage());


            }
        }

public void record(String filePath) {

        try {

            ObjectInputStream in = new ObjectInputStream(new FileInputStream(filePath));
            ArrayList<Item> list2 = (ArrayList<Item>) in.readObject();
            System.out.println(list2);
            list = list2;

            in.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

在您的 MainActivity 的 onDestroy 方法中, 将代码更改为,

tester.addCurrentList(filePath);

关于java - 在android中读取和写入序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257140/

相关文章:

java - 使用 Groovy 库更新后,在 Eclipse 启动时抛出一条警告消息来安装一些未安装的插件

java - 调试卡住的 Android 应用程序

java - 字符串到字节数组类型转换

android - 应用程序 UI 因 GC 消息而卡住

java - 将不同的参数传递给每个映射器

java - 如何在我的应用程序粘贴文件时有效地显示进度条?安卓

java - onConfigurationChanged 不再被调用

serialization - 支持序列化协程的语言

serialization - 如何将复杂对象存入hadoop Hbase?

serialization - `fmt` 包的函数是否支持数组的格式化程序?