这是一个将对象或集合写入本地还有sd卡以及如何读取的例子,提供大家参考。
转载请说明此处!!
通过以下图片了解本demo的主要功能:
上代码
首先在manifest中添加权限:
<!-- 在SDCard中创建与删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接着创建一个TestClass类用来测试:
public class TestClass implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public TestClass(String name, String gender) {
super();
this.name = name;
this.gender = gender;
}
}
记得改类要实现Serializable接口!!
接下来是将类保存到本地和sd卡的 OutputUtil 类及方法:
package com.example.inputoutputtest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Environment;
@SuppressLint("WorldReadableFiles")
public class OutputUtil<T> {
/**
* 将对象保存到本地
* @param context
* @param fileName 文件名
* @param bean 对象
* @return true 保存成功
*/
public boolean writeObjectIntoLocal(Context context,String fileName,T bean){
try {
// 通过openFileOutput方法得到一个输出流,方法参数为创建的文件名(不能有斜杠),操作模式
@SuppressWarnings("deprecation")
FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(bean);//写入
fos.close();//关闭输入流
oos.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
//Toast.makeText(WebviewTencentActivity.this, "出现异常1",Toast.LENGTH_LONG).show();
return false;
} catch (IOException e) {
e.printStackTrace();
//Toast.makeText(WebviewTencentActivity.this, "出现异常2",Toast.LENGTH_LONG).show();
return false;
}
}
/**
* 将对象写入sd卡
* @param fileName 文件名
* @param bean 对象
* @return true 保存成功
*/
public boolean writObjectIntoSDcard(String fileName,T bean){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//获取sd卡目录
File sdFile = new File(sdCardDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(sdFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(bean);//写入
fos.close();
oos.close();
return true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
else {
return false;
}
}
/**
* 将集合写入sd卡
* @param fileName 文件名
* @param list 集合
* @return true 保存成功
*/
public boolean writeListIntoSDcard(String fileName,List<T> list){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//获取sd卡目录
File sdFile = new File(sdCardDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(sdFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);//写入
fos.close();
oos.close();
return true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
else {
return false;
}
}
}
有了写入的类,自然还要一个读取的 InputUtil 类以及方法:
package com.example.inputoutputtest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.util.List;
import android.content.Context;
import android.os.Environment;
public class InputUtil<T> {
/**
* 读取本地对象
* @param context
* @param fielName 文件名
* @return
*/
@SuppressWarnings("unchecked")
public T readObjectFromLocal(Context context,String fielName){
T bean;
try {
FileInputStream fis = context.openFileInput(fielName);//获得输入流
ObjectInputStream ois = new ObjectInputStream(fis);
bean = (T) ois.readObject();
fis.close();
ois.close();
return bean;
} catch (StreamCorruptedException e) {
//Toast.makeText(ShareTencentActivity.this,"出现异常3",Toast.LENGTH_LONG).show();//弹出Toast消息
e.printStackTrace();
return null;
} catch (OptionalDataException e) {
//Toast.makeText(ShareTencentActivity.this,"出现异常4",Toast.LENGTH_LONG).show();//弹出Toast消息
e.printStackTrace();
return null;
} catch (FileNotFoundException e) {
//Toast.makeText(ShareTencentActivity.this,"出现异常5",Toast.LENGTH_LONG).show();//弹出Toast消息
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
//Toast.makeText(ShareTencentActivity.this,"出现异常6",Toast.LENGTH_LONG).show();//弹出Toast消息
e.printStackTrace();
return null;
}
}
/**
* 读取sd卡对象
* @param fileName 文件名
* @return
*/
@SuppressWarnings("unchecked")
public T readObjectFromSdCard(String fileName){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //检测sd卡是否存在
T bean;
File sdCardDir = Environment.getExternalStorageDirectory();
File sdFile = new File(sdCardDir,fileName);
try {
FileInputStream fis = new FileInputStream(sdFile);
ObjectInputStream ois = new ObjectInputStream(fis);
bean = (T) ois.readObject();
fis.close();
ois.close();
return bean;
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (OptionalDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
else {
return null;
}
}
/**
* 读取sd卡对象
* @param fileName 文件名
* @return
*/
@SuppressWarnings("unchecked")
public List<T> readListFromSdCard(String fileName){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //检测sd卡是否存在
List<T> list;
File sdCardDir = Environment.getExternalStorageDirectory();
File sdFile = new File(sdCardDir,fileName);
try {
FileInputStream fis = new FileInputStream(sdFile);
ObjectInputStream ois = new ObjectInputStream(fis);
list = (List<T>) ois.readObject();
fis.close();
ois.close();
return list;
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (OptionalDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
else {
return null;
}
}
}
封装完这些类后,接下来就是使用它们了。
在布局文件activity_main中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="#000000"
tools:context=".MainActivity" >
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="#ffffff"
android:text="对象的保存"/>
<Button
android:id="@+id/output_loacl"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="写入本地" />
<Button
android:id="@+id/input_loacl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="从本地读出" />
<Button
android:id="@+id/output_sdcard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="写入SD卡" />
<Button
android:id="@+id/input_sdcard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="从SD卡读出" />
<Button
android:id="@+id/output_sdcard_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="写入SD卡(集合)" />
<Button
android:id="@+id/input_sdcard_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="从SD卡读出(集合)" />
</LinearLayout>
最后是在MainActivity 中:
package com.example.inputoutputtest;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private Button output_loacl;
private Button input_loacl;
private Button output_sdcard;
private Button input_sdcard;
private Button output_sdcard_list;
private Button input_sdcard_list;
private TestClass bean;
private List<TestClass> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
/**
* 初始化
*/
private void init() {
output_loacl = (Button) findViewById(R.id.output_loacl);
input_loacl = (Button) findViewById(R.id.input_loacl);
output_sdcard = (Button) findViewById(R.id.output_sdcard);
input_sdcard = (Button) findViewById(R.id.input_sdcard);
output_sdcard_list = (Button) findViewById(R.id.output_sdcard_list);
input_sdcard_list = (Button) findViewById(R.id.input_sdcard_list);
output_loacl.setOnClickListener(this);
input_loacl.setOnClickListener(this);
output_sdcard.setOnClickListener(this);
input_sdcard.setOnClickListener(this);
output_sdcard_list.setOnClickListener(this);
input_sdcard_list.setOnClickListener(this);
bean = new TestClass("华少", "男");
list = new ArrayList<TestClass>();
list.add(new TestClass("小米", "女"));
list.add(bean);
}
/**
* write into local
* @param bean
*/
private void writeIntoLocal(TestClass bean){
if (new OutputUtil<TestClass>().writeObjectIntoLocal(MainActivity.this, "test.out", bean)) {
Toast.makeText(MainActivity.this, "写入本地成功", 2000).show();
}
else {
Toast.makeText(MainActivity.this, "写入本地失败", 2000).show();
}
}
/**
* rean from loacl
*/
private void readFormLoacl(){
TestClass bean1 = new InputUtil<TestClass>().readObjectFromLocal(MainActivity.this, "test.out");
if (bean1 == null) {
Toast.makeText(MainActivity.this, "本地读取失败", 2000).show();
}
else {
Toast.makeText(MainActivity.this, "本地读取成功"+bean1.getName()+"-"+bean1.getGender(), 2000).show();
}
}
/**
* write into sdcard
* @param bean
*/
private void writeIntoSDcard(TestClass bean){
if (new OutputUtil<TestClass>().writObjectIntoSDcard("test.out", bean)) {
Toast.makeText(MainActivity.this, "写入SD卡成功", 2000).show();
}
else {
Toast.makeText(MainActivity.this, "写入SD卡失败", 2000).show();
}
}
/**
* rean from sdcard
*/
private void readFromSDcard(){
TestClass bean1 = new InputUtil<TestClass>().readObjectFromSdCard("test.out");
if (bean1 == null) {
Toast.makeText(MainActivity.this, "SD卡读取失败", 2000).show();
}
else {
Toast.makeText(MainActivity.this, "SD卡读取成功"+bean1.getName()+"-"+bean1.getGender(), 2000).show();
}
}
/**
* write into sdcard (object)
* @param list
*/
private void writeListIntoSDcard(List<TestClass> list){
if (new OutputUtil<TestClass>().writeListIntoSDcard("testlist.out", list)) {
Toast.makeText(MainActivity.this, "写入SD卡成功", 2000).show();
}
else {
Toast.makeText(MainActivity.this, "写入SD卡失败", 2000).show();
}
}
/**
* rean from sdcard (集合)
*/
private void readListFromSDcard(){
List<TestClass> list = new InputUtil<TestClass>().readListFromSdCard("testlist.out");
if (list == null) {
Toast.makeText(MainActivity.this, "SD卡读取失败", 2000).show();
}
else {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).getName());
sb.append(list.get(i).getGender());
}
Toast.makeText(MainActivity.this, "SD卡读取成功"+sb, 2000).show();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.output_loacl:
writeIntoLocal(bean);
break;
case R.id.input_loacl:
readFormLoacl();
break;
case R.id.output_sdcard:
writeIntoSDcard(bean);
break;
case R.id.input_sdcard:
readFromSDcard();
break;
case R.id.output_sdcard_list:
writeListIntoSDcard(list);
break;
case R.id.input_sdcard_list:
readListFromSDcard();
break;
default:
break;
}
}
}
这样就大功告成了。
附:demo代码 点击打开链接
转载请说明出处
若有错误之处,感谢指出