文件存储

这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助。。

如果有需要查看SharedPreferences存储的请查看: Android中的数据存储(一):SharedPreferences

 一:使用范围:
   文件存储很明显就是存储文件,这一点不需要解释了吧!需要注意的是所存储的文件不能太大,以防内存不足。


二:核心原理:
依靠Context(上下文),Context提供了两个方法来打开数据文件里的文件IO流FileInputStream
openFileInput(String name)
; FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式:
模式有以下几种:
1.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND。
2.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
3.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
4.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
*最常用的是第一种和第二种。
Context还提供了另外的几个方法:
1.getDir(String
name , int mode)
:在应用程序的数据文件夹下获取或者创建name对应的子目录。
2.File
getFilesDir()
:获取该应用程序的数据文件夹的绝对路径。
3.String[]
fileList()
:返回该应用数据文件夹的全部文件。


三:注意事项:
1.保存时如果文件不存在,Android
会自动创建它。创建的文件保存在/data/data/<package name>/files目录。
2.文件传输时使用IO流,注意流的开和关,只要开流,结束时,必须关流。

接下来是实际代码:

下面的是向文件中保存数据:代码非常简单,就是IO流的运用。




下面是从文件中获取数据:也是简单地IO流运用




说完普通的文件存取,再来说一下特殊文件的存取,即存取SDCard上的文件:


存取SDCard上的文件:

存取思路:
1.调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限。
	Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2.调用Environment.getExternalStorageDirectory()方法来获取外部存储器。
	File file = new File(Environment.getExternalStorageDirectory(),"message.txt")
3.使用IO流操作SD卡上的文件了,这一点和普通文件就没什么区别了。

注意事项:
1.手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡。
2.必须在AndroidManifest.xml上配置读写SD卡的权限
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

接下来是SDCard文件存取的实际代码:
红色为保存数据,蓝色为获取数据:

package com.example.star.filesavesd.activity;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; import com.example.star.filesavesd.R;
import com.example.star.filesavesd.utils.MyToast; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText mEditText;
private Button mButtonSave;
private Button mButtonGet;
private String data; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
initView();
/*设置按钮监听*/
setlistener();
} /**
* 初始化控件
*/
private void initView() {
mEditText = (EditText) findViewById(R.id.editText);
mButtonSave = (Button) findViewById(R.id.main_btn_save);
mButtonGet = (Button) findViewById(R.id.main_btn_get); } /**
* 设置按钮监听
*/
private void setlistener() {
mButtonSave.setOnClickListener(this);
mButtonGet.setOnClickListener(this);
} /**
* 点击事件
*
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_btn_save:
//保存数据
saveData();
break;
case R.id.main_btn_get:
//获取数据
getData();
break;
default:
break;
}
} /**
* 保存数据到文件中
*/
private void saveData() {
//获取EditText的数据
data = mEditText.getText().toString().trim();
//判断数据是否为空
if (TextUtils.isEmpty(data)){
MyToast.show(getApplicationContext(),"数据为空");
return;
}
//判断是否存在sd卡,具有读取sd卡的权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
try {
File file = new File(Environment.getExternalStorageDirectory(),"message.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
bw.write(data);
bw.flush();
MyToast.show(getApplicationContext(),"数据保存成功"); } catch (Exception e) {
e.printStackTrace();
} }else{
MyToast.show(getApplicationContext(),"保存失败,SD卡不存在!");
}
} /**
* 获取文件中的数据
*/
private void getData() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ try {
File file = new File(Environment.getExternalStorageDirectory(),"message.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
BufferedReader br = new BufferedReader(new FileReader(file));
String readline = "";
StringBuffer sb = new StringBuffer();
while((readline = br.readLine()) != null){
sb.append(readline);
}
mEditText.setText(sb.toString());
br.close();
} catch (Exception e) {
e.printStackTrace();
} }else{
MyToast.show(getApplicationContext(),"读取失败,SD卡不存在!");
}
}
}


SDCard上的文件存储与普通文件存储的不同就在与SDCard的文件还得判断SDCard的状态,其余基本一致。

以上就是本人对文件存储的认识,欢迎各位大神、各位同胞指教。如有问题,请在评论区留下您的问题与建议,或者加QQ:2235792398,一起探讨。


Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏的更多相关文章

  1. Python解析HDF文件 分类: Python 2015-06-25 00:16 743人阅读 评论(0) 收藏

    前段时间因为一个业务的需求需要解析一个HDF格式的文件.在这之前也不知道到底什么是HDF文件.百度百科的解释如下: HDF是用于存储和分发科学数据的一种自我描述.多对象文件格式.HDF是由美国国家超级 ...

  2. NYOJ-214 单调递增子序列(二) AC 分类: NYOJ 2014-01-31 08:06 233人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> int len, n, i, j; int d[100005], a[100005]; int bin ...

  3. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  4. hadoop集群中的日志文件 分类: A1_HADOOP 2015-02-28 20:37 680人阅读 评论(0) 收藏

    hadoop存在多种日志文件,其中master上的日志文件记录全面信息,包括slave上的jobtracker与datanode也会将错误信息写到master中.而slave中的日志主要记录完成的ta ...

  5. Android 应用中十大常见 UX 错误 分类: H1_ANDROID 2013-09-21 13:59 404人阅读 评论(0) 收藏

    转载自:http://www.apkbus.com/android-5661-1.html 摘要: Android 开发者关系团队每天都会试用无数的 App 或者受到无数的开发者发来的请求评测的 Ap ...

  6. .net 实现Office文件预览 Word PPT Excel 2015-01-23 08:47 63人阅读 评论(0) 收藏

    先打个广告: .Net交流群:252713569 本人QQ :524808775 欢迎技术探讨, 近期公司要求上传的PPT和Word都需要可以在线预览.. 小弟我是从来没有接触过这一块的东西 感觉很棘 ...

  7. Oracle垃圾数据清理相关问题 分类: Oracle 2015-08-06 11:14 12人阅读 评论(0) 收藏

    垃圾数据清理,简单的说,就是删除不需要的那些数据,释放存储空间 最常用的就是delete命令.truncate命令,甚至是删除表空间重建,具体操作都很简单,不是本文的重点 下面,总结几个垃圾数据清理常 ...

  8. iOS中UITextField 使用全面解析 分类: ios技术 2015-04-10 14:37 153人阅读 评论(0) 收藏

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  9. irms模拟数据生成及数据分析 分类: H_HISTORY 2015-03-06 14:17 212人阅读 评论(0) 收藏

    一.数据准备 1.每天生成随机一个文本,每小时向文本中追加2次数据,每次10万条 随机数据生成: 2,32  * * * *  bash /mnt/jediael/irms/signalGenerat ...

随机推荐

  1. Opencv 配置VS2012

    开始接触图像处理有一段时间了,经过前期的调研,和相关入门知识的学习,开始接触一些图像处理应用的工具.Opencv是一个图像处理的开源库,由于其开放的协议架构,国内外很多科研机构和团队都在基于openc ...

  2. java的loadrunner脚本案例

    /* * LoadRunner Java script. (Build: 670) *  * ״̬£º²¢·¢²âÊÔͨ¹ý * ²âÊÔÈË£ºÕÔС±ò * ÈÕÆÚ£º2013-09-2 ...

  3. Groovy 与 DSL

    一:DSL 概念 指的是用于一个特定领域的语言(功能领域.业务领域).在这个给出的概念中有 3个重点: 只用于一个特定领域,而非所有通用领域,比如 Java / C++就是用于通用领域,而不可被称为 ...

  4. 运行级别(run level)

    inittab是很多linux版本的启动脚本.Linux在完成核内引导以后,就开始运行init程序,它的进程号是1,是所有其他进程的起点.init需要读取/etc/inittab,该文件告诉init在 ...

  5. alias命令别名

    笔者在看<鸟哥私房菜>时,突然看到这个命令,之前未接触过,故简单记录学习下,具体的大家可参见man手册.功能说明:设置指令的别名.语 法:alias[别名]=[指令名称]参 数 :若不加任 ...

  6. strcpy、memcpy和memset之间的区别

    今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...

  7. Java显式锁学习总结之三:AbstractQueuedSynchronizer的实现原理

    概述 上一篇我们讲了AQS的使用,这一篇讲AQS的内部实现原理. 我们前面介绍了,AQS使用一个int变量state表示同步状态,使用一个隐式的FIFO同步队列(隐式队列就是并没有声明这样一个队列,只 ...

  8. 铁器 · Burp Suite

    Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代 ...

  9. linux中的vim 编辑一行内容,如何使光标快速移动到行首和行尾以及行中间某处啊?

    光标定位G 移至行行首nG 移至第n行行首n+ 移n行行首n- 移n行行首n$ 移n行(1表示本行)行尾0 所行行首$ 所行行尾^ 所行首字母h,j,k,l 左移移移右移H 前屏幕首行行首M 屏幕显示 ...

  10. 可图性判定--Havel-Hakimi定理

    两个概念 1.度序列 若把图G所有顶点的度数排成一个序列S,则称S为图G的度序列. 2.序列是可图的 一个非负整数组成的序列如果是某个无向图的度序列,则称该序列是可图的. Havel-Hakimi定理 ...