文件存储

这是本人(菜鸟)学习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. SQLite3 C/C++ 开发接口简介(API函数)

    from : http://www.sqlite.com.cn/MySqlite/5/251.Html 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的 ...

  2. dpkg的用法 (转)

    dpkg是一个Debian的一个命令行工具,它可以用来安装.删除.构建和管理Debian的软件包. 下面是它的一些命令解释: 1)安装软件 命令行:dpkg -i <.deb file name ...

  3. css预处理scss环境配置

    css 预处理器 CSS 预处理器用一种专门的编程语言,进行 Web css编码,然后再编译成正常的 CSS 文件,以供项目使用:说简单点就是在某个环境下写css 可以写变量.表达式.嵌套等,在通过该 ...

  4. LGPL 与GPL的区别

    GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样.GPL的出发点是 ...

  5. leetcode 之Sum系列(七)

    第一题是Two Sum 同样是用哈希表来做,需要注意的是在查打gap是要排除本身.比如target为4,有一个值为2,gap同样为2. vector<int> twoSum(vector& ...

  6. 洛谷 P2077 红绿灯 题解

    题目传送门 这道题一秒一秒的扫描一定会超时,所以就用一种O(N)的算法. #include<bits/stdc++.h> using namespace std; ],b[],c[],x= ...

  7. [笔记] 几个前端bug的解决方案

    jQuery UI下被拖动的元素上飘 症状出现在几乎所有浏览器里.使用 1.10.x 的draggable,在滚动栏下移(即非处于页面顶部)的时候拖动draggable的元素,它会向上跳一段距离.解决 ...

  8. 【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法

    已知k阶斐波那契序列的定义为 f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1; f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,... 试编写求k阶斐 ...

  9. Java实现web在线预览office文档与pdf文档实例

    https://yq.aliyun.com/ziliao/1768?spm=5176.8246799.blogcont.24.1PxYoX 摘要: 本文讲的是Java实现web在线预览office文档 ...

  10. Python并发编程-一个简单的多进程实例

    import time from multiprocessing import Process import os def func(args,args2): #传递参数到进程 print(args, ...