Android--序列化/数据存入、读出SD卡
2016-08-16 22:23
495 查看
序列化
内外存储写对象,需要写对象,在内存中传递对象,A activity 传入b activity中需要序列化。
序列化两种:serializable、Parcelable
支持可序列化:
对象读写文件推荐使用:serializable
在JAVA中建议使用Parcelable
例题:将数据传入SD卡中,启动就会读取
本题有两种方法:1.传入字符串:读取时根据分割字符读取
2.传入一个实体类
本题中使用第一种,在此给出第二种的方法
下面是实体对象的class文件
此处继承了Serializable 接口,实现序列化
下面为第一种方法代码:需要注意的是开始没有文件,会报错,需要加如判断。
接下来是布局文件
实现效果如下:
内外存储写对象,需要写对象,在内存中传递对象,A activity 传入b activity中需要序列化。
序列化两种:serializable、Parcelable
支持可序列化:
对象读写文件推荐使用:serializable
在JAVA中建议使用Parcelable
例题:将数据传入SD卡中,启动就会读取
本题有两种方法:1.传入字符串:读取时根据分割字符读取
2.传入一个实体类
本题中使用第一种,在此给出第二种的方法
//传进去一个Object类 ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Message message=new Message(); message.setTitle(c1.isChecked()); message.setChajian(c3.isChecked()); message.setInformation(c2.isChecked()); message.setRead(c4.isChecked()); message.setCollection(c5.isChecked()); message.setCollection(c6.isChecked()); message.setSize(tv3.getText().toString()); String statu=Environment.getExternalStorageState(); if (!statu.equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(SettingSDActivity.this,"SD卡未就绪",Toast.LENGTH_SHORT).show(); return ; } File root=Environment.getExternalStorageDirectory(); FileOutputStream fos=null; ObjectOutputStream oos=null; try { fos=new FileOutputStream(root+"/settings.txt"); try { oos=new ObjectOutputStream(fos); oos.writeObject(message); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); }finally { if (fos != null) { try { fos.close(); fos.flush(); } catch (IOException e) { e.printStackTrace(); } } } } }); }
下面是实体对象的class文件
此处继承了Serializable 接口,实现序列化
public class Message implements Serializable { private Boolean title; private String size; private Boolean information; private Boolean chajian; private Boolean read; private Boolean collection; private Boolean top; public Message(Boolean title, String size, Boolean information, Boolean chajian, Boolean read, Boolean collection, Boolean top) { this.title = title; this.size = size; this.information = information; this.chajian = chajian; this.read = read; this.collection = collection; this.top = top; } public Boolean getTitle() { return title; } public void setTitle(Boolean title) { this.title = title; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public Boolean getInformation() { return information; } public void setInformation(Boolean information) { this.information = information; } public Boolean getChajian() { return chajian; } public void setChajian(Boolean chajian) { this.chajian = chajian; } public Boolean getRead() { return read; } public void setRead(Boolean read) { this.read = read; } public Boolean getCollection() { return collection; } public void setCollection(Boolean collection) { this.collection = collection; } public Boolean getTop() { return top; } public void setTop(Boolean top) { this.top = top; } public Message() { } }
下面为第一种方法代码:需要注意的是开始没有文件,会报错,需要加如判断。
public class SettingSDActivity extends AppCompatActivity { private CheckBox c1,c2,c3,c4,c5,c6; private TextView tv3,ok; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting_sd); c1=(CheckBox)findViewById(R.id.c1); c2=(CheckBox)findViewById(R.id.c2); c3=(CheckBox)findViewById(R.id.c3); c4=(CheckBox)findViewById(R.id.c4); c5=(CheckBox)findViewById(R.id.c5); c6=(CheckBox)findViewById(R.id.c6); tv3=(TextView)findViewById(R.id.tv3); ok=(TextView)findViewById(R.id.ok); tv3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AlertDialog.Builder builder=new AlertDialog.Builder(SettingSDActivity.this); builder.setTitle("字体大小请选择"); builder.setIcon(R.mipmap.ic_launcher); final String[] items={"大","中","小"}; // builder.setMultiChoiceItems()多选 builder.setSingleChoiceItems(items, 1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { Toast.makeText(getBaseContext(), items[i].toString(), Toast.LENGTH_SHORT).show(); tv3.setText(items[i].toString()); dialog.dismiss(); } }); builder.setCancelable(false); AlertDialog alertDialog=builder.create(); alertDialog.show(); } }); ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { saveFile(); } }); //保存到SD卡上, public void saveFile(){ FileOutputStream fos=null; //获取SD卡状态 String state= Environment.getExternalStorageState(); //判断SD卡是否就绪 if(!state.equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this, "请检查SD卡", Toast.LENGTH_SHORT).show(); return; } //取得SD卡根目录 File file= Environment.getExternalStorageDirectory(); try { Log.d("=====SD卡根目录:", file.getCanonicalPath().toString()); //输出流的构造参数1:可以是File对象,也可以是文件路径 //输出流的构造参数2:默认为fasle=>覆盖内容:true=>追加内容 // File myFile=new File(file.getCanonicalPath()+"/sd.txt"); // fos=new FileOutputStream(myFile); //加true追加模式 //文件位置 fos=new FileOutputStream(file.getCanonicalPath()+"/sd.txt"); String str=content(); fos.write(str.getBytes()); Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); }finally { if (fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } public String content(){ String a,b,c,d,e,f,g,h; if(c1.isChecked()){ a="check"; }else{ a="uncheck"; } if(c2.isChecked()){ b="check"; }else{ b="uncheck"; } if(c3.isChecked()){ c="check"; }else{ c="uncheck"; } if(c4.isChecked()){ d="check"; }else{ d="uncheck"; } if(c5.isChecked()){ e="check"; }else{ e="uncheck"; } if(c6.isChecked()){ f="check"; }else{ f="uncheck"; } g=tv3.getText().toString(); h=a+"#"+g+"#"+b+"#"+c+"#"+d+"#"+e+"#"+f; return h; } //读取文件 public String readFile(){ BufferedReader reader=null; FileInputStream fis=null; StringBuilder sbd=new StringBuilder(); String statu=Environment.getExternalStorageState(); if (!statu.equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this,"SD卡未就绪",Toast.LENGTH_SHORT).show(); return ""; } //拿到SD卡根目录 File root=Environment.getExternalStorageDirectory(); try { fis=new FileInputStream(root+"/sd.txt"); reader= new BufferedReader(new InputStreamReader(fis)); String row=""; try { while ((row=reader.readLine())!=null){ sbd.append(row); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { Toast.makeText(this,"文件不存在",Toast.LENGTH_SHORT).show(); e.printStackTrace(); }finally { if (reader!=null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sbd.toString(); } //一开始就读取 @Override protected void onStart() { super.onStart(); String my = readFile(); if(my != ""){ String k[] = my.split("#"); if (k[0].equals("check")) { c1.setChecked(true); } else { c1.setChecked(false); } tv3.setText(k[1]); if (k[2].equals("check")) { c2.setChecked(true); } else { c2.setChecked(false); } if (k[3].equals("check")) { c3.setChecked(true); } else { c3.setChecked(false); } if (k[4].equals("check")) { c4.setChecked(true); } else { c4.setChecked(false); } if (k[5].equals("check")) { c5.setChecked(true); } else { c5.setChecked(false); } if (k[6].equals("check")) { c6.setChecked(true); } else { c6.setChecked(false); } } } }
接下来是布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"> </LinearLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:layout_width="280dp" android:layout_height="wrap_content" android:text="设置" android:textSize="25sp" android:gravity="center" /> <TextView android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="提交" android:textSize="25sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="列表显示摘要" android:textSize="25sp" /> <CheckBox android:id="@+id/c1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" android:layout_marginLeft="150dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:id="@+id/LL1" > <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="字体大小" android:textSize="25sp" /> <TextView android:id="@+id/tv3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="中 >" android:textSize="25sp" android:layout_marginLeft="205dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="列表页评论" android:textSize="25sp" /> <TextView android:id="@+id/tv5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="不限 >" android:textSize="25sp" android:layout_marginLeft="153dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2G/3G网络流量" android:textSize="25sp" /> <TextView android:id="@+id/tv7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="较省流量(普通下载)>" android:textSize="15sp" android:layout_marginLeft="15dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="清理缓存" android:textSize="25sp" /> <TextView android:id="@+id/tv9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="当前缓存:2.48MB>" android:textSize="20sp" android:layout_marginLeft="70dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="推送通知" android:textSize="25sp" /> <CheckBox android:id="@+id/c2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="200dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="互动插件" android:textSize="25sp" /> <CheckBox android:id="@+id/c3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="200dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自动优化阅读" android:textSize="25sp" /> <CheckBox android:id="@+id/c4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="152dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv13" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="收藏时转发" android:textSize="25sp" /> <CheckBox android:id="@+id/c5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="175dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" > <TextView android:id="@+id/tv14" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顶踩时转发" android:textSize="25sp" /> <CheckBox android:id="@+id/c6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="175dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#a9a8a8" ></View> </LinearLayout> </ScrollView> </LinearLayout>
实现效果如下:
相关文章推荐
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 【Android游戏开发十二】详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- android 如何新建sd卡,如何往sd卡存数据
- Android将数据持久化到文件中,读写SD卡
- Android中使用照相机权限、在SD卡创建和删除文件权限、在SD卡中写入数据权限
- C# 二进制数据、图片存入、读出 sql server 数据库
- (转)【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- android数据存储与访问之使用SD卡
- android 向SD卡写入数据
- android: activity之间传递复杂数据类型[使用Serializable序列化或者Parcelable序列化]
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android学习 之 Bitmap Drawable byte[] 三者之间的转换以及把数组存入数据库及提取数据重新组合成所需对象,如图像
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android -- Parcelable 序列化操作数据(上篇)
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 初学Android,数据存储之读写SD卡文件(四十三)
- Android 复习 把数据存储到SD卡