Android数据存储(2)向机身内存(Internal Storage)和SDcard(External Storage)读写数据实例 (1)
第4章 Android中的数据存储

第4章Android中的数据存取程序是数据的输入、处理、输出的过程,不管是操作系统还是应用程序,都不可避免要用到大量的数据。
由于内存容量有限,且一旦关机,内存中的信息都消失,因此,一般把需要下次使用的数据保存在磁盘(对于手机来说SD卡)中。
操作系统一般以文件的形式来保存数据,而应用程序更喜欢使用数据库来保存。
在手机中,也有许多需要保存的数据,如音频文件、视频、图片、通讯录、短信、游戏中的设置等数据。
Android作为一种手机上的操作系统,提供了以下几种数据存取方式:Preference(配置)、File(文件)、SQLite(数据库)、网络等。
另外,在Android中,各个应用程序组件之间是相互独立的,彼此的数据一般不能共享,为了实现数据的共享,Android提供Content Provider组件来实现应用程序之间的数据共享(最典型的共享就如通讯录)。
4.1 PreferencePreference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。
它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。
4.1.1 Preference简介使用Preference方式来存取数据,要用到SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences( String name, int mode)方法可得到SharedPreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。
操作模式有三种:MODE_PRIV ATE(私有)、MODE_WORLD_READABLE (可读)和MODE_WORLD_WRITEABLE(可写)。
SharedPreferences提供了获得数据的方法,如:getString、getInt等。
第4章-Android数据存储

Android系统架构
4、内核层(Linux Kernel)
Android平台的系统内核是Linux 2.6,其包含的主要功 能有安全(Security)、内存管理(Memory Management)、 进程管理(Process Managemen)、网络协议栈(Network Stack)、硬件驱动(Driver Model)等,Linux内核同时也作 为硬件和软件栈之间的抽象层。
Android中最普通的模块之一,也是开发者最常遇到的模块之 一。在Android程序中,一个Activity就相当于手机屏幕的一页显示,类 似于浏览器的一个网页。通常在Activity中添加一些UI组件,并对这些 组件实现相应的事件处理。在一个Android应用程序中,可能涉及多个 Activity,并在这几个Activity中进行跳转。打开一个新的Activity时会将 当前的Activity置为暂停状态并压入堆栈,,Android默认会把每个应用 从开始到当前的每个Activity都保存到堆栈中,也可以通过设定使一些 无需保留的Activity不压入堆栈。
第四章 Android开发框架
>本章主要内容 ♦Android系统架构
♦Android应用程序组成
♦Activity生命周期
♦Android项目架构
♦AndroidManifest.xml文件解析
♦XML简介
♦Android生命周期
Android系统架构
Android系统架构
与其它操作系统一样,Android的系统架构采用了分层结构。 Android分为四层,从高到低分别是应用程序层、应用程序框架层、系 统运行库层(包含系统库和Android运行库)和linux核心层。 Android从本质上来讲是一套软件堆叠(Software Stack),主要分 为三层:即操作系统、中间件和应用程序。其中,Android的中间件可 以再细分出两层,底层是函数库(Library)和虚拟机(Virtual Machine; VM),上层为应用程序框架(Application Framework)。上面架构图中 蓝色部分(包括上两大层和Android Runtime中的Core Libraries)使 用Java语言开发,绿色部分(LIBRAIES)使用C/C++开发,红色部分 (Linux Kernel)使用C开发,黄色部分为Dalvik VM。
DataStorage(数据存储)之内部储存(InternalStorage)

DataStorage(数据存储)之内部储存(InternalStorage)Data Storage(数据存储)之内部储存(Internal Storage)读取⼿机内部储存,Activity 中调⽤ openFileOutput(file_name, mode)⽅法返回File 对象;file_name: ⽂件名mode: 操作⽂件的类型Context.MODE_PRIVATE:代表⽂件是私有的,如果重新调⽤,则原来的数据会被覆盖Context.MODE_APPEND:先判断⽂件是否存在,如果存在,则在在原来的数据后⾯追加内容 />Context.MODE_WORLD_READABLE:其他应⽤程序由权限读取Context.MODE_WORLD_WRITEABLE:其他应⽤程序由权限写⼊如果当其他程序同时具有读写功能,则应该这样写:openFileOutput(FILE_NAME, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);下⾯是个⼩Demo:public void writeFile(View view) {try {FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);fos.write(string_01.getBytes());fos.close();Toast.makeText(InternalStorageActivity.this, "Saved...", Toast.LENGTH_LONG).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}读取或者写⼊⽂件,默认⽬录是:/data/data/<package-name>/files/⽂件夹下我们也可以使⽤Activity 提供的getCacheDir()和getFilesDir()⽅法:获取/data/data/<package-name>/下的/cache和/files读取⽂件则调⽤openFileInput(FILE_NAME)⽅法public void readFile(View view) {try {FileInputStream fis = openFileInput(FILE_NAME);BufferedReader br = new BufferedReader(new InputStreamReader(fis));String line = null;while ((line = br.readLine()) != null) {String str = new String(line);Log.i(TAG, str);}Toast.makeText(InternalStorageActivity.this, "Read...", Toast.LENGTH_LONG).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}操作外部储存(内存卡)由于Android 系统内存⼤⼩的局限,⽐如我们储存⽂件就要把它放在外部存储中,在操作之前,我们要在AndroidManifest.xml 中设置读写操作:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 、、、、<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>操作外部储存(内存卡)由于Android 系统内存⼤⼩的局限,⽐如我们储存⽂件就要把它放在外部存储中,在操作之前,我们要在AndroidManifest.xml 中设置读写权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />创建和删除权限<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>Android 中的Environment 类对外部存储卡的操作,getExternalStorageState() ⽅法,判断外部储存卡的状态,如果为MEDIA_MOUNTED 则表⽰可操作getExternalStorageDirectory() ⽅法,获取外部储存的⽬录,可以对其⽬录进⾏操作/*** 读取外部储存卡* 在外部储存卡上创建⼀个demo.tet ⽂件,并写⼊字符* 为了沿着⽂件已经写⼊外部储存,所有读取创建的⽂件*/public void getExternalStorage(View view) throws IOException {// Android 中的Environment 类对外部存储卡的操作,// getExternalStorageState() ⽅法,判断外部储存卡的状态,如果为MEDIA_MOUNTED 则表⽰可操作//getExternalStorageDirectory() ⽅法,获取外部储存的⽬录,可以对其⽬录进⾏操作String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {File sdcardDir = Environment.getExternalStorageDirectory();File saveFile = new File(sdcardDir, "demo.text");FileOutputStream fos = new FileOutputStream(saveFile);fos.write("text".getBytes());fos.close();Toast.makeText(InternalStorageActivity.this, "getExternalStorage", Toast.LENGTH_LONG).show();File[] fileDir = sdcardDir.listFiles();for (File file : fileDir) {String fileName = file.toString();Log.i(TAG, "FileName: " + fileName);}FileInputStream fis = new FileInputStream(saveFile);byte[] buffer = new byte[1024];int len = 0;String value = null;while ((len = fis.read(buffer)) != -1) {value = new String(buffer, 0, len);}fis.close();Log.i(TAG, "getValue = " + value);}}。
Android数据存储(Data Storage)

Android提供几种保存持久化应用程序数据的选择。
依赖具体的需求来选择解决适合的方案,如数据应该是应用程序私有的还是共享的,以及数据所需要的存储空间等。
以下是可选择的数据存储方案:共享偏好(Shared Preferences)用键---值对的形式保存私有的原始数据。
内部存储(Internal Storage)在设备的内存上保存私有的数据。
外部存储(External Storage)在共享的外部存储器上保存公共的数据。
SQLite数据库在私有的数据库中保存结构化的数据。
网络连接(Network Connection)把数据保存在自己的互联网服务器上。
Android提供了内容提供器(content provider),能够你的私有数据公开给其他应用程序。
内容提供器是一种公开应用程序数据的读写访问权限的可选组件,这种读写访问会受到你所施加的任何限制的影响。
使用共享偏好SharedPreference类提供了一个一般性的框架,它允许用原始类型数据的键---值对的形式来保存和获取持久化的数据。
使用SharedPreference能够保存任意类型的原始类型数据:布尔型、浮点型、整数型、以及字符串。
这种数据会跨越用户的会话周期被持久化保存(即使是应用程序进程被杀死)。
有两种方法来为应用程序获取SharedPreferences对象:1.getSharedPreferences()方法---如果需要多个用名称来标识的偏好文件,就要使用这个方法,它的第一个参数要指定偏好文件的名称。
2.getPreferences()方法---如果仅需要针对Activity的一个偏好文件,就使用这个方法。
因为这个方法仅返回当前Activity的偏好文件,不需要提供偏好文件的名称。
以下是向偏好文件中写入数据的方法:1.调用edit()方法来获取一个SharedPreferences.Editor对象;2.调用诸如putBoolean()和putString()等方法来添加要保存的值;3.调用commit()方法来提交要保存的新值。
Android内部存储外部存储及读写权限

Android内部存储外部存储及读写权限在我们使用 Android 设备的过程中,经常会涉及到数据的存储和读写操作。
了解 Android 的内部存储、外部存储以及相应的读写权限对于开发者和普通用户来说都非常重要。
首先,我们来谈谈 Android 的内部存储。
内部存储是指设备内部为应用程序分配的一块私有存储空间。
这个空间对于每个应用来说是相对独立和安全的,其他应用无法直接访问。
内部存储的优点在于其数据的保密性和安全性较高。
应用在内部存储中保存的数据,除非用户明确授予权限或者应用本身存在漏洞,否则其他应用无法获取。
这使得一些敏感信息,比如用户的登录凭证、个人设置等,可以安全地存放在内部存储中。
然而,内部存储也有其局限性。
由于它的空间相对较小,对于一些需要大量存储数据的应用,比如视频播放软件、大型游戏等,可能会很快耗尽内部存储的空间。
接下来,我们再看看 Android 的外部存储。
外部存储通常指的是我们常见的 SD 卡或者设备内置的可扩展存储空间。
与内部存储不同,外部存储是可以被多个应用共享访问的。
外部存储的优势在于其存储空间通常较大,可以满足应用存储大量数据的需求,比如照片、视频、音乐等文件。
但这也带来了一些潜在的问题。
由于多个应用可以访问外部存储,数据的安全性和一致性可能会受到一定影响。
在 Android 系统中,对于应用访问内部存储和外部存储,都有相应的读写权限控制。
这些权限的设置旨在保护用户的隐私和数据安全。
对于内部存储的读写权限,应用在默认情况下就具有读写自己内部存储空间的权限。
但如果应用想要访问其他应用的内部存储数据,这是被严格禁止的,除非通过特殊的系统机制或者用户明确授权。
而对于外部存储的读写权限,情况则相对复杂一些。
在 Android 60(API 级别 23)及更高版本中,应用在运行时需要动态申请读写外部存储的权限。
这意味着应用不能在安装时默认获得这些权限,而是在需要进行相关操作时向用户请求授权。
Android7-Android 数据存储

内容概要
SharedPreferences存储方式; 文件存储方式;
SQLite数据库存储方式;
ContentProvider存储方式;
网络存储方式.
SharedPreferences存储方式
Android提供了5种存储方式,分别是 1) SharedPreferences存储方式; 2) 文件存储方式; 3) SQLite数据库存储方式; 4) ContentProvider存储方式; 5) 网络存储方式.
文件பைடு நூலகம்储方式
文件存储方式是一种较常用的方法,在Android中读 取/写入文件的方法,与 Java中实现I/O的程序是完 全一样的,提供了openFileInput()和 openFileOutput()方法来读取设备上的文件。 String fn = “moandroid.log”; FileInputStream fis = openFileInput(fn); FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE); 提示:openFileInput和openFileOutput方法中用到的 文件都是存储在/data/data/packageName/files目录 下的。
ContentProvider
ContentProvider实现 要创建我们自己的Content Provider的话,我们需要 遵循以下几步: a. 创建一个继承了ContentProvider父类的类 b. 定义一个名为CONTENT_URI,并且是public static final的Uri类型的类变量,你必须为其指定 一个唯一的字符串值,最好的方案是以类的全名称, 如:
Android应用开发入门数据存储方式

Android应用开发入门数据存储方式Android应用程序开发是现代软件开发领域中的重要一环。
对于一个功能完备的Android应用而言,数据的存储是至关重要的。
本文将介绍Android应用开发中的数据存储方式,并探讨其各自的优缺点。
1. Shared Preferences(共享首选项)Shared Preferences是Android中最简单的数据存储方式之一。
它基于键值对的形式存储数据,并将数据存储在应用包的私有目录中。
Shared Preferences适用于存储少量简单的配置数据,如用户偏好设置或应用程序的状态信息。
Shared Preferences的优点在于它的易用性和速度。
由于数据存储在本地文件中,读写速度非常快。
同时,Shared Preferences支持多种数据类型,包括布尔型、整型、浮点型、字符串型等。
然而,Shared Preferences的局限性也不容忽视。
它适用于存储少量简单的数据,如果数据量大或者复杂,Shared Preferences可能不够灵活。
此外,由于数据存储在私有目录中,不适合用于存储敏感数据。
2. Internal Storage(内部存储)Internal Storage是Android应用程序的内部存储空间,可以用于存储私有文件或数据库。
通过Internal Storage存储的数据仅对应用程序本身可见。
这种数据存储方式适用于需要保存大量数据或者需要保护数据安全性的场景。
使用Internal Storage存储数据的过程很简单,只需调用相应的API即可。
可以使用FileOutputStream和FileInputStream来读写文件,也可以使用SQLite数据库进行数据存储。
SQLite是Android内置的轻量级关系型数据库,对于结构化的数据存储非常方便。
Internal Storage的优点包括数据隔离性、数据安全性和高速读写能力。
然而,与Shared Preferences相比,使用Internal Storage需要处理文件和数据的读写操作,并需要关注内存空间的管理,因此稍显复杂。
android面试基础知识

android面试基础知识1. 什么是Android?Android是一个基于Linux平台、由Google开发的移动操作系统,主要面向手机、平板电脑等移动设备。
它拥有开放的应用程序开发平台,对第三方开发者非常友好,有丰富的应用程序、游戏等。
2. Android应用程序的基本组成部分是什么?Android应用程序的基本组成部分有四个:活动(Activity)、服务(Service)、内容提供者(Content Provider)和广播接收器(Broadcast Receiver)。
3. 什么是活动(Activity)?活动是Android中最基本的应用程序单元,每个活动就是一个界面。
用户通过这个界面和应用程序进行交互。
活动可以包含一个用户界面,主要用于展示应用程序的功能和数据。
4. 什么是服务(Service)?服务是后台运行的应用程序组件,没有任何用户界面,主要用于在后台执行长时间运行的任务,如下载数据、播放音乐等。
5. 什么是内容提供者(Content Provider)?内容提供者是Android中用于管理应用程序私有数据或者共享数据的组件,可以让其他应用程序通过Content Resolver来访问和修改数据,实现数据共享的目的。
6. 什么是广播接收器(Broadcast Receiver)?广播接收器是Android中的一种机制,用于在不同的应用程序之间传递消息或事件。
广播接收器可以监听特定的广播事件,并在广播事件发生时做出响应。
7. 什么是Intent(意图)?Intent是Android中非常重要的一种消息传递机制,可以用来指明某个应用程序需要执行什么操作,或者要启动哪个组件。
具体来说,Intent表示应用程序的意图,用于描述想要完成的操作或者打开哪个界面。
8. Android中四种存储方式?Android中四种存储方式包括:1)Shared Preferences:用于存储少量的键值对数据,常用于存储应用程序的配置信息等;2)Internal Storage:用于存储应用程序的私有数据,只能被应用程序本身访问,不需要权限;3)External Storage:用于存储应用程序的公共数据,可被其他应用程序访问,需要特定权限(如写SD卡的权限);4)SQLite数据库:用于存储应用程序的大数据量,可进行高效的数据查询和管理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { private Button read; private Button write; private EditText ed1; private EditText ed2; private EditText ed3; private Button delete; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main); read = (Button) findViewById(R.id.read); write = (Button) findViewById(R.id.write); delete = (Button) findViewById(R.id.delete); ed3 = (EditText) findViewById(R.id.ed3); ed2 = (EditText) findViewById(R.id.ed2); ed1 = (EditText) findViewById(R.id.ed1); write.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String str = ed1.getText().toString(); if (!str.equals("")) { write(str); } } }); read.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { read(); } }); delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String str = ed3.getText().toString(); if (!str.equals("")) { deleteFiles(str); } else { ed3.setText(str + ":该文件输入错误或不存在!"); } } }); } private void write(String content) { try { // 以追加的方式打开文件输出流 FileOutputStream fileOut = this.openFileOutput("test.txt", this.MODE_APPEND);
打开
(/download.html)
即使是一小步 也想与你分享
(/download.html)
(/comment/alllist? id=12524539)
5 0 0 分享
机身内存数据读写实例
<LinearLayout xmlns:android="/apk/res/android" xmlns:tools="/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity" > <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/ed1" android:inputType="textMultiLine"/> <Button android:id="@+id/write" android:text="写入" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/read" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="读入"/> <EditText android:id="@+id/ed2" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputTyplt;Button android:id="@+id/delete" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="删除指定的文件" /> <EditText android:id="@+id/ed3" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
package com.android.xiong.fileiotest; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import ng.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener;
// 写入数据 fileOut.write(content.getBytes()); // 关闭文件输出流 fileOut.close(); } catch (Exception e) { e.printStackTrace(); } } private void read() { try { ed2.setText(""); // 打开文件输入流 FileInputStream fileInput = this.openFileInput("test.txt"); BufferedReader br = new BufferedReader(new InputStreamReader( fileInput)); String str = null; StringBuilder stb = new StringBuilder(); while ((str = br.readLine()) !=null ) { stb.append(str); } ed2.setText(stb); } catch (Exception e) { e.printStackTrace(); } } //删除指定的文件 private void deleteFiles(String fileName) { try { // 获取data文件中的所有文件列表 List<String> name = Arrays.asList(this.fileList()); if (name.contains(fileName)) { this.deleteFile(fileName); ed3.setText(fileName + ":该文件成功删除!"); } else ed3.setText(fileName + ":该文件输入错误或不存在!"); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
SDcard数据读写
1.SDcard数据读写需要注定的先要在Androidmainfest.xml文件中注册新建删除和读写的权限 : <!-- 在SD卡上创建与删除权限 --> <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" /> <!-- 向SD卡上写入权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 2.读写的基本流程就是: 2. 1 通过Environment类的getExternalStorageState()方法来判断手机是否有SDcard: Environment.getExternalStora geState().equals(Environment.MEDIA_MOUNTED) 2.2 最通过getExternalStorageDirectory()方法来获取文件目录:File file = new File(Environment.getExternalStorage Directory().getCanonicalPath() + "/test.txt"); 读写的文件都在sdcrad文件夹中 通过File Explorer可以导出来 2.3 其后就和基本IO操作相同了 2.4还有要注意一点的是 在运行的模拟器的时候要附带虚拟的SDcard时 要在Run as->Run Configurations 中要关联一 下 如下图