【Android】14.1 内部文件存储和读取
分类:C#、Android、VS2015;
创建日期:2016-02-27
一、简介
内部存储(Internal storage)是指将应用程序建立的私有文件保存在内部存储器(移动经销商卖的那种容量较小的手机卡)中。其特征如下:
- 总是可用的
- 文件默认只能被自己的app所访问。
- 当用户卸载app的时候,系统会把internal内该app相关的文件都清除。
- Internal storage是确保不被用户与其他app所访问的最佳存储区域。
可通过OpenFileInput方法和OpenFileOutput方法读取内部存储设备上的这些文件。
1、私有目录的存储位置
/data/data/[packagename]/files:文件目录,一般保存容量较小的文件,如果是图片,不建议保存这里。
/data/data/[packagename]/cache:缓存目录。
/data/data/[packagename]/databases,存放数据库。
/data/data/[packagename]/shared_prefs 保存应用的SharedPreferences。
/data/data/[packagename]/lib,应用程序使用的.so文件目录。
2、OpenFileOutput方法
该方法打开应用程序私有文件,为写入设备做准备。默认情况下,写入的文件会覆盖同名的原文件。如果要打开的文件不存在,则创建一个新文件。
该方法的语法格式如下:
public override Stream OpenFileOutput(string name, FileCreationMode mode)
通过mode参数可更改文件写入的方式:
- FileCreationMode.Private:私有模式(默认)。文件只能被创建的程序访问,或被具有相同UID的程序访问。
- FileCreationMode.Append:追加模式,文件不存在就先创建再添加,存在就在原文件的末尾添加新数据。
- FileCreationMode.WorldReadable:全局读模式,允许任何程序读取私有文件。
- FileCreationMode.WorldWriteable:全局写模式,允许任何程序写入私有文件。
例如:
string fileName="a1.txt";
var f=OpenFileOutput(fileName, FileCreationMode.Private);
string text="some data";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
f.Write(bytes, 0, bytes.Length);
f.Flush ();
f.Close();
注意:出于性能考虑,Android会把写入的数据先暂存到数据缓冲区中,等积累到一定程度再写入文件,因此,调用Close方法之前,一定要调用Flush方法,以确保将缓冲区的数据写入文件。
另外,为了避免忘记关闭Stream引起内存溢出,最好像本节下面的完整例子那样用using语句将其包围起来。
3、OpenFileInput方法
该方法打开应用程序私有文件,为读取做准备。该方法的语法格式如下:
public override Stream OpenFileInput(string name)
注意:name是指不带路径的文件名。
不论是读文件还是写文件,都有可能产生异常,实际使用时,始终不要忘了用try/catch捕获这些异常。作为例子,为了避免冲淡关注的内容,就不再捕获这些异常了。
4、System.IO.File类提供的静态方法
除了上面两种方式外,还可以直接用.NET提供的System.IO.File类的静态方法来读取和写入内部存储文件,而且用起来更简单。
二、示例
1、运行截图
2、设计步骤
(1)添加ch1401_Main.axml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/btnWrite"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="写私有文件到内部存储器" />
<Button
android:id="@+id/btnRead"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="读取内部存储器中的私有文件" />
<TextView
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="match_parent"
android:id="@+id/textView1"
android:layout_marginTop="80dp"
android:background="@android:color/holo_green_dark"
android:gravity="fill_vertical"
android:shadowRadius="30"
android:textColor="@android:color/white"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginBottom="40dp"
android:layout_height="match_parent" />
</LinearLayout>
(2)添加ch1401MainActivity.cs文件
using System.IO;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例14-1】内部文件存取")]
public class ch1401MainActivity : Activity
{
private Stream stream;
private string fileName = "a1.txt"; protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1401_Main); stream = OpenFileOutput(fileName, FileCreationMode.Private);
string filePath = GetFileStreamPath(fileName).Path; var textView1 = FindViewById<TextView>(Resource.Id.textView1);
Button btnWrite = FindViewById<Button>(Resource.Id.btnWrite);
btnWrite.Click += delegate
{
//用法1--不使用Android提供的API
string str = "Hello, 你好。";
File.WriteAllText(filePath, str, Encoding.UTF8);
textView1.Text = $"文件已写入内存卡。\n写入内容:{str}\n文件位置:\n{filePath}"; //用法2--使用Android提供的API
//using (var f = OpenFileOutput(fileName, FileCreationMode.Private))
//{
// string str = "Hello, 你好。";
// byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
// f.Write(bytes, 0, bytes.Length);
// f.Flush();
// filePath = GetFileStreamPath(fileName).Path;
// textView1.Text = $"文件已写入内存卡。\n写入内容:{str}\n文件位置:\n{filePath}";
//}
}; Button btnRead = FindViewById<Button>(Resource.Id.btnRead);
btnRead.Click += delegate
{
//用法1
string s = File.ReadAllText(filePath, Encoding.UTF8);
textView1.Text = $"读取的文件:\n{filePath}\n读出的内容:\n{s}"; //用法2
//using (var f = OpenFileInput(fileName))
//{
// string s = "";
// byte[] bytes = new byte[1024];
// int n;
// while ((n = f.Read(bytes, 0, 1024)) > 0)
// {
// s += System.Text.Encoding.UTF8.GetString(bytes, 0, n);
// }
// textView1.Text = $"读取的文件:\n{filePath}\n读出的内容:\n{s}";
//}
};
}
}
}
【Android】14.1 内部文件存储和读取的更多相关文章
- 【Android】14.2 外部文件存储和读取
分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 1.基本概念 内部存储的私有可用存储空间一般都不会很大,对于容量比较大的文件,例如视频等,应该将其存储在外部存储设 ...
- Android——数据存储(课堂代码整理:SharedPreferences存储和手机内部文件存储)
layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- Android面试收集录 文件存储
1.请描述Android SDK支持哪些文件存储技术? 使用SharePreferences保存key-value类型的数据 流文件存储(openFileOutput+openFileInput或Fi ...
- eclipse中如何查看一个android模拟器的内部文件
eclipse中如何查看一个android模拟器的内部文件,有时要在其中添加一个文件夹或是什么的,要手动的做这件事,而不能够用代码去完成时,就要用这个方法了. 1.首先,打开一个安卓模拟器. 2.这个 ...
- Linux基础篇学习——Linux文件系统之文件存储与读取:inode,block,superblock
Linux文件类型 代表符号 含义 - 常规文件,即file d directory,目录文件 b block device,块设备文件,支持以"block"为单位进行随机访问 c ...
- Android常用布局、文件存储与权限、XML
常用的布局 LinearLayout Android 2.2开始fill_parent改名为match_parent ,从API Level为8开始我们可以直接用match_parent来代替fill ...
- Android学习--持久化(一) 文件存储
持久化之 文件存储 这里把Android持久化全都整理一下,这一篇文章先简单的说一下文件的存储,通过下面一个简单的Demo,理解一下这个文件存储,先说说下面Demo的思路: 1.创建EditTex ...
- .Net下二进制形式的文件存储与读取
.Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回 ...
- android之外部文件存储和读取
这次借用上次读写内部存储的代码,只是对将更换文件的读写路径即可.这里需要对获取SDcard的读写权限. 一.AndroidManifest.xml 这里增加了对外部存储设备的读写权限 <?xml ...
随机推荐
- SharePoint 2013 App 示例之图片墙
应用程序实质上是 Web 应用程序.如果您知道如何生成 Web 应用程序,则您就知道如何生成 SharePoint 相关应用程序.您可以使用任何语言,如 HTML.JavaScript.PHP 或 . ...
- Ubuntu删除文件夹的命令
1. 删除文件夹的内容包括文件夹: rm -rf 文件夹的名字 (-r 是 循环的意思, f是不询问的意思) 2 .删除文件夹的内容不包括文件夹: rm -rf 文件夹的名字/* ...
- Thymeleaf th:action
th:attr 任何属性值 <form action="subscribe.html" th:attr="action=@{/subscribe}"> ...
- Flink及主流流框架spark,storm比较
干货 | Flink及主流流框架比较 IT刊 百家号17-05-2220:16 引言 随着大数据时代的来临,大数据产品层出不穷.我们最近也对一款业内非常火的大数据产品 - Apache Flink做了 ...
- Vue组件开发实践之scopedSlot的传递
收录待用,修改转载已取得腾讯云授权 导语 现今的前端开发都讲究模块化组件化,即把公共的交互和功能封装到一个个的组件之中,在开发整体界面的时候就能像搭积木一样快速清晰高效.在使用Vue开发我们的vhtm ...
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
GLCanvasImpl.java是接口GLCanvas的唯一实现类,也就是说二者在功能上完全等同.代码中调用GLCanvas对象函数的地方,等效于调用GLCanvasImpl中的该函数,GLCanv ...
- 从AIDL开始谈Android进程间Binder通信机制
转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...
- (剑指Offer)面试题43:n个骰子的点数
题目: 把n个骰子仍在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 思路: s可能出现的值的范围为:n--6*n 1.全排列 回溯法枚举n个骰子(6面)的全排列,然 ...
- 转自http://bbs.linuxtone.org/thread-1062-1-1.html
详细参考:http://wiki.codemongers.com/NginxChsHttpMainModule worker_processes指明了nginx要开启的进程数,据官方说法,一般开一个就 ...
- 【EasyUI】——EasyUI的布局
做一个站点首先要有站点的布局,所谓的布局事实上就是网页的排版.就是说你的网页显示时是什么样子的. 就比方百度的首页: 无论是谁登录.网页都是这个样式的. EasyUI中的网页布局一共分为五部分,分别为 ...