gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:25:22 26 4
gpt4 key购买 nike

我一直在这里搜索,但似乎找不到有效的方法。我正在尝试将一个简单的对象列表写入序列化文件,但似乎无法在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com