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

Java 在android中读取和写入序列化对象,java,android,serialization,Java,Android,Serialization,我一直在这里搜索,但似乎找不到有效的方法。我试图将一个简单的对象列表写入一个序列化文件,但在android中似乎找不到该文件。这是我第一次构建应用程序,我通过指向src/list.ser在netbeans中实现了这一点,但是,这在android studio中不起作用。我想我的问题是把ser文件放在哪里,以及如何在代码中指向它?这是我的密码: 列表活动: public class ListActivity extends Activity implements Serializable {

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

列表活动:

 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());
        }

    }

}
公共类ListActivity扩展活动实现可序列化{
私有数组列表;
public List()引发异常{
列表=新的ArrayList();
}
公共void附加项(字符串名称){
列表。添加(新项目(名称));
}
public void addCurrentList()引发异常{
字符串pathToAppFolder=getExternalFilesDir(null).getAbsolutePath();
字符串filePath=pathToAppFolder+File.separator+“list.ser”;
试一试{
ObjectOutputStream os=新的ObjectOutputStream(新的FileOutputStream(filePath));
os.writeObject(列表);
os.close();
}
捕获(例外e){
System.out.println(“NOPE-NOPE-NOPE”);
}
}
public void addItem(字符串名称,整数价格){
增加(新项目(名称、价格));
}
公共ArrayList填充(){
退货清单;
}
公开作废记录(){
试一试{
ObjectInputStream in=新ObjectInputStream(新文件输入流(“src/list.ser”));
.readObject()中的ArrayList list2=(ArrayList);
System.out.println(列表2);
列表=列表2;
in.close();
}捕获(例外e){
System.out.println(e.getMessage());
}
}
}
主要活动:

 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;
    }

}
public类MainActivity扩展了AppCompatActivity{
私人名单测试员;
私有ListView lv;
私人编辑文本gg;
私人按钮;
私人按钮clearButton;
私有数组列表;
字符串pathToAppFolder=getExternalFilesDir(null).getAbsolutePath();
字符串filePath=pathToAppFolder+File.separator+“list.ser”;
@凌驾
受保护的空onDestroy(){
试一试{
tester.addCurrentList();
}捕获(例外e){
e、 printStackTrace();
}
super.ondestory();
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建列表
lv=(ListView)findViewById(R.id.listDisplay);
ListView矿山=lv;
列表=新的ArrayList();
试一试{
tester=新列表();
}
捕获(例外e){
}
用于(项目:tester.populate()){
列表。添加(项目);
}
final ArrayAdapter ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,list);
低压设置适配器(阵列适配器);
final TextView firstTextView=(TextView)findviewbyd(R.id.TextView);
按钮=(按钮)findViewById(R.id.button);
clearButton=(按钮)findViewById(R.id.clear);
gg=(EditText)findViewById(R.id.item);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
字符串编号=gg.getText().toString();
如果(!no.isEmpty()){
测试仪附加项(编号);
arrayAdapter.add(否);
arrayAdapter.notifyDataSetChanged();
gg.setText(“”);
}
}
});
clearButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
arrayAdapter.clear();
arrayAdapter.notifyDataSetChanged();
}
});
setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
String item=lv.getItemAtPosition(position.toString();
移除(arrayAdapter.getItem(位置));
arrayAdapter.notifyDataSetChanged();
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
}

首先,确保您有权写入外部存储器

作为

使用创建一个文件路径

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
是一个已定义的关键字,它不是这样做的最佳实践

更改列表活动中的方法,如下所示

    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());
        }
    }

我以前试过使用上下文,它总是说找不到符号。如何使用上下文?请尝试我的编辑,您可以在读取文件时执行相同的操作尝试您的编辑,但仍会引发异常。在哪里放置.ser文件?是否应该在资产文件夹中?此文件将在应用程序文件夹中创建(应用程序文件夹是专用于应用程序的位置)。是否确实要放置现有文件而不是创建新文件。伊姑
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
    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());
        }
    }
tester.addCurrentList(filePath);