SharedPreference

  以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中

  使用方式     

    创建对象的方式有三种

      Context 的 getSharedPreferences()

      Activity 的 getPreferences()

      PreferenceManager 的 getDefaultSharedpreferences()

    获取数据

      sharedPrefs.getXXX()方法,如getInt(),getString()等

    储存数据  获取Editor对象 sharedPrefs.edit();

    存入数据  editor.putXXX()方法,如putInt()、putString()

    提交要保存的数据    editor.commit()

我们通过路径找文件 看一下运行结果 路径我在上面已经提到了  我使用的是Genymotion测试

访问手机内部存储需要root权限才可以访问

内部存储

    将数据保存在内存空间中,数据用户不能轻易访问的区域,访问需要root权限。存储在/data/data/程序包名/files文件夹下

  使用方式

    其使用还是要通过FileInputStream和FileOutputStream对文件File进行操作,只不过不是通过他们的构造方法来创建。

  获取FileInputStream

    FileInputStream fis = openFileInput();        (Activity的方法)

    FileOuputStream fos = openFileOutput();         (Activity的方法)

文件File将会自动创建

外部SDCard存储

在操作sd卡的时候需要在清单文件中添加权限

将数据保存到SDCard卡中,任何程序都可以访问,用户也很容易查看、修改。

  使用方式

    通过FileInputStream和FileOutputStream对文件File进行操作。

  SDCard操作类Environment      进行SDCard状态获取

    Environment.getExternalStorageState();    获取扩展卡状态

    Environment.MEDIA_MOUNTED    安装的并可读写

    Environment.MEDIA_MOUNTED_READ_ONLY    安装的但只读

    Environment.MEDIA_REMOVED        移除的

  获取常用文件夹路径

    Environment.getExternalStorageDirectory();    获取扩展卡根文件夹

这个路径在sd卡下自己写  找不到 只能轻轻说声加油~

贴一个小demo

运行效果

在edittext 输入文本点击写入按钮   点击读取显示到textview      重要的事情说三遍   加权限~加权限~加权限~

activity_main.xml

  

<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.example.lesson15_data_storage.MainActivity"> <CheckBox
android:id="@+id/push"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="是否追加到原文件末尾"/> <EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示文本"/>
<Button
android:id="@+id/inner_storage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存文本到内部存储中"
android:onClick="onClick"/>
<Button
android:id="@+id/inner_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取内部存储的文本到TextView"
android:onClick="onClick"/> <Button
android:id="@+id/outter_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="读取扩展卡的文本到textview"/> <Button
android:id="@+id/outter_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="将文本写入到扩展卡中"/>
</LinearLayout>

MainActivity

  

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private CheckBox cbPush;
private TextView textView;
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cbPush= (CheckBox) findViewById(R.id.push);
textView= (TextView) findViewById(R.id.text_view);
edit= (EditText) findViewById(R.id.edit);
getSharedPreferences(); } /**
* 存储一个CheckBox的选中状态
*/
private void getSharedPreferences() { //Context获取 参数1文件名 参数2文件权限
SharedPreferences preferences=getSharedPreferences("setting", Context.MODE_PRIVATE);
//activity获取 文件名是当前活动名
SharedPreferences preferences1=getPreferences(MODE_PRIVATE);
//获取editor对象
SharedPreferences.Editor editor1=preferences1.edit();
//保存数据
editor1.putString("text","通过activity对象获取");
//提交数据
editor1.commit();
//PreferenceManager获取 文件名自动生成 访问权限默认私有
PreferenceManager.getDefaultSharedPreferences(MainActivity.this)
.edit()
.putString("text","通过PreferenceManager获取")
.commit();
//参数1 key 参数2 默认值 基本数据类型要求不可以为空 所以必须有默认值
boolean checked=preferences.getBoolean("cbPush",false); cbPush.setChecked(checked);
cbPush.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//通过context获取 参数1 存储的文件名 参数2 数据的访问权限
SharedPreferences sharedPreferences=getSharedPreferences("setting", Context.MODE_PRIVATE);
//获取编辑器对象
SharedPreferences.Editor edit=sharedPreferences.edit();
//存入数据
edit.putBoolean("cbPush",isChecked);
//提交修改
edit.commit();
}
});
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.inner_storage:
write();//写入到内部文件
Toast.makeText(MainActivity.this,"写入成功",Toast.LENGTH_SHORT).show();
break;
case R.id.inner_read:
read();//读取内部文件
Toast.makeText(MainActivity.this,"读取成功",Toast.LENGTH_SHORT).show();
break;
case R.id.outter_read:
oread();//读取sdcard文件
Toast.makeText(MainActivity.this,"读取成功",Toast.LENGTH_SHORT).show();
break;
case R.id.outter_write:
owrite();//写入sdcard文件
Toast.makeText(MainActivity.this,"写入成功",Toast.LENGTH_SHORT).show();
break;
}
} private void oread() {
String state=Environment.getExternalStorageState();
try {
//判断是否读写 或只读
if(state.equals(Environment.MEDIA_MOUNTED)||state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
File sdcardRoot=Environment.getExternalStorageDirectory();
File read=new File(sdcardRoot,"my/text.txt");
if(read.exists()){
FileInputStream fis=new FileInputStream(read);
//字节转字符会进行字节编码的转换 new InputStreamReader(fis,"utf-8") android默认utf-8
BufferedReader reader=new BufferedReader(new InputStreamReader(fis));
String str=reader.readLine();
textView.setText(str);
reader.close();
fis.close();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} private void owrite() {
try {
//获取扩展卡状态
String state= Environment.getExternalStorageState();
//是否可读写
if(state.equals(Environment.MEDIA_MOUNTED)){
//获取扩展卡文件夹目录
File sdcardRoot=Environment.getExternalStorageDirectory();
File save=new File(sdcardRoot,"my/text.txt");
//判断文件是否存在
if (save.exists()){ }else{
//判断父级文件夹是否存在
if(!save.getParentFile().exists()){
//创建文件夹
save.getParentFile().mkdirs();
}
//创建文件
save.createNewFile();
}
String text=edit.getText().toString();
//文件是否在原文件末尾追加 cbPush.isChecked() checkbox 是否选中
FileOutputStream fos=new FileOutputStream(save,cbPush.isChecked());
fos.write(text.getBytes("utf-8"));
fos.flush();
fos.close(); // //是否是文件夹
// save.isDirectory();
// //是否是文件
// save.isFile();
// //是否是隐藏文件 文件名以 .开头的文件
// save.isHidden();
// //获取所有子文件的文件名数组
// save.list();
// //获取所有子文件的文件数组
// save.listFiles();
}
} catch (IOException e) {
e.printStackTrace();
}
} private void read() {
try {
//读取写入的文件
FileInputStream fis=openFileInput("text.txt");
int len=-1;
byte [] b=new byte[1024];
ByteArrayOutputStream bos=new ByteArrayOutputStream();
while ((len=fis.read(b))!=-1){
bos.write(b,0,len);
}
textView.setText(bos.toString("utf-8"));
bos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} private void write() {
try {
//获取输入框内容
String text=edit.getText().toString();
//判断是否为空
if(TextUtils.isEmpty(text))return;
//写入方式 追加或覆盖
int mode=cbPush.isChecked()?MODE_APPEND:MODE_PRIVATE;
//获取FileOutputStream
FileOutputStream fos=openFileOutput("text.txt",mode);
//字符串转换为byte 写入文件
fos.write(text.getBytes("utf-8"));
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Android简单介绍SharedPreference,内部文件,sdcard数据存储的更多相关文章

  1. Android中使用File文件进行数据存储

    Android中使用File文件进行数据存储 上一篇学到使用SharedPerences进行数据存储,接下来学习一下使用File进行存储 我们有时候可以将数据直接以文件的形式保存在设备中, 例如:文本 ...

  2. 用SharedPreference或文件的方式存储数据

    一.用SharedPreference存储数据 当程序有少量的数据需要保存,而这些数据的格式比较简单(例如一些配置信息),这个时候就可以使用SharedPreference来进行保存 下面例子将演示向 ...

  3. Android 简单介绍图片压缩和图片内存缓存

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...

  4. 【Android】14.1 内部文件存储和读取

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 内部存储(Internal storage)是指将应用程序建立的私有文件保存在内部存储器(移动经销商卖的那种容量较 ...

  5. Android 学习第17课,使用文件的数据存储(4种存储模式)

    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...

  6. Android简单介绍

    1)Android定义: 2)版本号变迁 3)开发类型 4)Android五大组件 5)Android五大布局

  7. Android应用开发基础之二:数据存储和界面展现(二)

    常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRightOf="@id/tv1" 设置在指 ...

  8. Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider

    Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/data/程 ...

  9. Java Linked集合的简单介绍和常用方法的使用

    LinkedList的简单介绍 java.util.LinkedList 集合数据存储的结构是链表结构.LinkedList是一个双向链表在实际开发中,对一个集合元素的添加和删除,经常涉及到首尾操作, ...

随机推荐

  1. 作为前端应当了解的Web缓存知识

    缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备.对于前端开发者来说,浏览器充当了重要角色.除此外常见的还有各种各样的代理服务器也可以做缓存.当Web请求到达缓存时, ...

  2. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

  3. 分享一个与ABP配套使用的代码生成器源码

    点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...

  4. ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...

  5. [译]ZooKeeper recipes-引言

    ZooKeeper高级应用 本系列将指导使用ZooKeeper来实现高级功能,所有功能都在客户端完成,不需要ZooKeeper的特殊支持.希望可以得到社区的支持将这些加入到一个标准的客户端类库中(Cu ...

  6. Android-Eclipse-INSTALL_FAILED_UPDATE_INCOMPATIBLE错误

    电脑重装了系统,环境问题一大堆,唉,搞死人,这不,今天就出现了这样的一个奇怪的问题. INSTALL_FAILED_UPDATE_INCOMPATIBLE 最后搜了一遍,发现是因为已经安装了这个包,包 ...

  7. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  8. UploadFile控件,提交图片后,页面预览显示刚刚提交的图片

    最近在用asp.net来写一个新闻系统后台,然后由于不用用网上的flash插件来上传图片什么的,我就用asp.net的控件来写,但是控件总归有一些用的不够灵活的地方.这次测试提出,文章在修改的时候,需 ...

  9. 非关系型数据库来了,CRL快速开发框架升级到版本4

    轮子?,我很任性,我要造不一样的轮子,同时支持关系型和非关系型的框架有没有 新版数据查询作了些调整,抽象了LabmdaQueryy和DBExtend,升级到版本4,非关系数据库MongoDB被支持了! ...

  10. 通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD

    前言 老规矩,任何技术的入门我通常都会总结增删改查,本文我就通过HttpWebRequest和SolrNet的方式实现Solr最基础的增删改查(CURD).对于自己的完整项目,同时不想过于依赖第三方类 ...