Android连载29-持久化技术

摘要:
Context类提供openFileOutput方法以将数据存储在文件中(=Null){writer.close();}}捕获{e.printStackTrace()。

一、持久化技术

  • 我们平时所使用的APP产生的数据,在内存中都是瞬时的,会随着断电、关机等丢失数据,因此android系统采用了持久化技术,用于存储这些“瞬时”数据
  • 持久化技术包括:文件存储、SharedPreference存储以及数据库存储,还有更复杂的SD卡内存储。

二、文件存储

  • 最基本存储方式,不对存储内容进行格式化处理,适用于存储简单文本或者二进制数据,若存储一些复杂数据,那么需要定义格式规范,方便后续解析出来。
  • Context类提供了openFileOutput方法用于将数据存储到文件中。
  • 该方法接收两个参数,第一个为文件名(不可以包含路径,因为数据已经默认存储到/data/data<packagename>/files/目录下面了。第二个参数时文件的操作模式,包括两种MODE_PRIVATEMODE_APPEND,前一个是默认,缩写内容会覆盖。后一个表示追加内容,不存在就创建文件。
  • openFileOutput()方法返回的是一个FileOutputStream对象,得到该对象之后,可以使用流的方式写入文件。以下是一段简单的演示:
public void save(){
	String data = "Data to save";
	FileOutputStream out = null;
	BufferedWriter writer = null;
	try{
		out = openFileOutput("data",Context.MODE_PRIVATE);
		writer = new BufferedWrirter(new OutputStreamWriter(out));
		writer.write(data);
	} catch (IOException e){
		e.printStackTrace();
	} finally {
		try{
			if(writer != null){
				writer.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
  • 如上就是写一个存储文件的Java流的一系列操作,如果不明白其中的含义,可以参见Java连载的流的那几期。

1.建立一个FilePersistenceTest项目用于演示

  • 先修改anctivity_main.xml文件代码
<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" >
	
    <EditText
        android: 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type something here" />
       
</LinearLayout>
  • 运行显示:
    29.1
  • 可以看到APP有一个地方可以写入文本,但是这都是临时文件,一退出就没了,因此我们需要改一下这个主xml的活动逻辑MainActivity.java文件
package com.example.filepersistencetest;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends Activity {
	
	private EditText edit;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		edit = (EditText)findViewById(R.id.edit);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		String inputText = edit.getText().toString();
		save(inputText);
	}
	
	public void save(String inputText) {
		FileOutputStream out = null;
		BufferedWriter writer = null;
		try{
			out = openFileOutput("data",Context.MODE_PRIVATE);
			writer = new BufferedWriter(new OutputStreamWriter(out));
			writer.write(inputText);
		} catch (IOException e){
			e.printStackTrace();
		} finally {
			try{
				if(writer != null){
					writer.close();
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}
}

  • 解析:我们在主活动中获取了EditText标签的文本内容,保存在了edit变量中,然后重写了onDestroy()方法,保证了在销毁这个活动的时候,能够保证内容已经保存在APP中,save方法基本和我们之前举例的一致。

  • 那么如果确认我们已经保存了数据呢?
    29.2

  • 打开DDMS的File Explorer来查看一下,按图示打开文件com.example.persistencetest/files/目录下面内容,并且到处,使用notepad++打开看一看,确实是我们之前输入的
    29.3

2.如何从文件中读取数据

  • 读取文件的函数openFileInput()方法,用于从文件中读取数据,参数只有一个即使文件名,当然也不需要路径,因为android已经提前定义好了/data/data/<packagename>/files/目录下面,并返回一个FileInputStream对象,演示一波
public String load(){
	FileInputStream in = null;
	BufferReader reader = null;
	StringBuilder content = new StringBuilder();
	try {
		in = openFileInput("data");
		reader = new BufferedReader(new InputStreamReader(in));
		String line = "";
		while((line=reader.readLine())!=null){
			content.append(line);
		}
	}catch(IOException e){
		e.printStackTrace();
	}finally{
		if(reader != null){
			try{
				reader.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}
	return content.toString();
}
  • 上面的代码显示出一行一行的读取出文件内容。

三、源码:

免责声明:文章转载自《Android连载29-持久化技术》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇svn 基础 入门 (Good!)自动波特率检测下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据持久层

持久是相对于瞬时来说的,其实就是可以把数据固化在硬盘或者磁带一类可以保存很长时间的设备上,不像放在内存中一样断电就消失了。企业应用中数据很重要(各种订单数据、客户数据、库存数据之类的),比应用程序本身更重要,所以需要把数据持久化。持久化可以通过很多方式,写文件和数据库都可以。只是现在企业一般都会选择把数据持久化到数据库中,因为可以很方便的查询统计分析,但数...

Android持久化存储——(包含操作SQLite数据库)

《第一行代码》读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Android存储中,最基本的一种存储方式。 就是利用Context类的方法,获取输入输出字节流对象,之后,就是java的文件操作。 特点: 不对存储的数据进行任何格式...

iOS 数据持久化 NSUserDefault

每一个应用都有一个 NSUserDefaults 实例,向 NSUserDefaults 类发送 standardUserDefaults 消息可以得到该实例。 NSUserDefaults 实例类似与 NSMutableDictionary,可以通过键存取或删除该对象。 当应用第一次使用 NSUserDefaults 实例时,NSUserDefaults...

iOS数据持久化的方式

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以...

线上Redis高并发连接失败问题排查

项目背景  最近,做一个按优先级和时间先后排队的需求。用 Redis 的 sorted set 做排队队列。   主要使用的 Redis 命令有, zadd, zcount, zscore, zrange 等。   测试完毕后,发到线上,发现有大量接口请求返回超时熔断(超时时间为3s)。   Error日志打印的异常堆栈为:     redis.clien...

ActiveMQ之JMS及保证消息的可靠性&amp;lt;持久化、事务、签收&amp;gt;(三)

1.JAVAEE 是一套使用Java 进行企业级开发的13 个核心规范工业标准 , 包括:  JDBC  数据库连接  JNDI  Java的命名和目录接口  EJB   Enterprise java bean  RMI   远程方法调用    一般使用TCP/IP 协议  Java IDL    接口定义语言  JSP      Servlet   X...