Java 如何在Android中加载文件并将其保存在对象列表中?
嘿,我的Android应用程序有问题。我是安卓开发的新手,尝试了一款安卓应用程序。我想将输入保存在一个文件中并加载它。我想在文件中保存序列化的对象(或对象列表)。我的想法是加载这个文件,如果存在的话,并用它们填充我的ListView,否则我会有一条短信 我在LogCat和Android监视器中调试我的应用程序。我不知道错误在哪里 问题是,如果我启动我的应用程序,onStart方法开始。我执行一个函数,返回一个记录列表。但为此,我将文件加载到此列表中。(我认为这是错误) 以下是我在LogCat中的错误:(这是其中的一部分) 这是我的主要活动:Java 如何在Android中加载文件并将其保存在对象列表中?,java,android,android-studio,serialization,fileinputstream,Java,Android,Android Studio,Serialization,Fileinputstream,嘿,我的Android应用程序有问题。我是安卓开发的新手,尝试了一款安卓应用程序。我想将输入保存在一个文件中并加载它。我想在文件中保存序列化的对象(或对象列表)。我的想法是加载这个文件,如果存在的话,并用它们填充我的ListView,否则我会有一条短信 我在LogCat和Android监视器中调试我的应用程序。我不知道错误在哪里 问题是,如果我启动我的应用程序,onStart方法开始。我执行一个函数,返回一个记录列表。但为此,我将文件加载到此列表中。(我认为这是错误) 以下是我在LogCat中的
@Override
protected void onStart(){
super.onStart();
List<Record> records = RecordDAO.findAll(this);
ArrayAdapter<Record> adapter =
new ArrayAdapter<Record>(this,
android.R.layout.simple_list_item_1,records);
mRecordsListView.setAdapter(adapter);
}
public static List<Record> findAll(Context ctx){
List<Record> result;
Object obj = null;
File f = ctx.getFileStreamPath("records.obj");
if(f.exists()){
try(FileInputStream in = ctx.openFileInput("records.obj")){
ObjectInputStream objIn = new ObjectInputStream(in);
obj = objIn.readObject();
}catch(Exception e){
e.printStackTrace();
}
}
if(obj != null){
result = (List<Record>) obj;
}else{
result = new ArrayList<>();
}
return result;
}
@覆盖
受保护的void onStart(){
super.onStart();
List records=RecordDAO.findAll(this);
阵列适配器=
新阵列适配器(此,
android.R.layout.simple_list_item_1,记录);
mRecordsListView.setAdapter(适配器);
}
这是记录道:
@Override
protected void onStart(){
super.onStart();
List<Record> records = RecordDAO.findAll(this);
ArrayAdapter<Record> adapter =
new ArrayAdapter<Record>(this,
android.R.layout.simple_list_item_1,records);
mRecordsListView.setAdapter(adapter);
}
public static List<Record> findAll(Context ctx){
List<Record> result;
Object obj = null;
File f = ctx.getFileStreamPath("records.obj");
if(f.exists()){
try(FileInputStream in = ctx.openFileInput("records.obj")){
ObjectInputStream objIn = new ObjectInputStream(in);
obj = objIn.readObject();
}catch(Exception e){
e.printStackTrace();
}
}
if(obj != null){
result = (List<Record>) obj;
}else{
result = new ArrayList<>();
}
return result;
}
公共静态列表findAll(上下文ctx){
列出结果;
objectobj=null;
文件f=ctx.getFileStreamPath(“records.obj”);
如果(f.exists()){
try(FileInputStream in=ctx.openFileInput(“records.obj”)){
ObjectInputStream objIn=新ObjectInputStream(in);
obj=objIn.readObject();
}捕获(例外e){
e、 printStackTrace();
}
}
如果(obj!=null){
结果=(列表)obj;
}否则{
结果=新的ArrayList();
}
返回结果;
}
更新:这是我保存对象的方法
public static void persistAll(Context ctx, List<Record> records){
try(FileOutputStream out = ctx.openFileOutput("records.obj",Context.MODE_PRIVATE)){
ObjectOutputStream objOut = new ObjectOutputStream(out);
objOut.writeObject(records);
}catch(Exception e){
e.printStackTrace();
}
}
publicstaticvoidpersistall(上下文ctx,列表记录){
try(FileOutputStream out=ctx.openFileOutput(“records.obj”,Context.MODE\u PRIVATE)){
ObjectOutputStream objOut=新的ObjectOutputStream(输出);
对象写入对象(记录);
}捕获(例外e){
e、 printStackTrace();
}
}
如果您可以在将对象写入文件的位置附加代码,那就太好了。正如错误消息所说,您可能正在文件中写入一条记录,并试图将其作为列表读取。相反,您应该将其作为ArrayList编写,并将其作为列表读取。如果您可以在将对象写入文件的位置附加代码,那就太好了。
正如错误消息所说,您可能正在文件中写入一条记录,并试图将其作为列表读取。相反,您应该将其作为ArrayList编写并作为列表读取。您的应用程序似乎在这一行崩溃:
result = (List<Record>) obj;
您的应用程序似乎正在这一行崩溃:
result = (List<Record>) obj;
log cat消息说,
de.tarasov.wladimir.leistungen.models.Record不能强制转换为java.util.List
,因此根据这一情况,错误必须在findAll方法中result=(List)obj代码>我认为您需要一个循环来遍历对象,每次向列表中添加对象时records.obj中有什么内容?异常很可能是由result=(List)obj抛出的代码>。不使用JSON存储对象有什么特别的原因吗?如果您这样做了,您将使用TypeToken并执行类似于log cat消息的操作:de.tarasov.wladimir.leistungen.models.Record不能强制转换为java.util.List
,因此根据这一情况,错误必须在findAll方法result=(List)obj代码>我认为您需要一个循环来遍历对象,每次向列表中添加对象时records.obj中有什么内容?异常很可能是由result=(List)obj抛出的代码>。不使用JSON存储对象有什么特别的原因吗?如果您这样做了,您将使用TypeToken并执行类似于result.add(obj);//方法add()希望我使用参数types->add(int,Record),…:(您的列表是来自java.util
包的引用吗?如果您的result
是java.util.List
,您可以通过调用result.add(obj)向其添加obj
);
。这将在结果的末尾添加obj
。无需指定index.result.add(obj);//add()方法希望我使用参数类型->添加(int,Record),…:(您的List
是来自java.util
包的引用吗?如果您的result
是java.util.List
,您可以通过调用result.add(obj);
将obj
添加到result
的末尾。无需指定索引。