android本地、sd卡保存对象或集合,以及读取该对象

这是一个将对象或集合写入本地还有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代码  点击打开链接


转载请说明出处


若有错误之处,感谢指出

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值