文件存储

这是本人(菜鸟)学习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. 做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table【转】

    做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table 浓缩版: 使用replicate_do_db和replicate_i ...

  2. Eloqument 学习

    参考地址:https://d.laravel-china.org/docs/5.5/eloquent#mass-assignment

  3. leetcode 之Median of Two Sorted Arrays(五)

    找两个排好序的数组的中间值,实际上可以扩展为寻找第k大的数组值. 参考下面的思路,非常的清晰: 代码: double findMedianofTwoSortArrays(int A[], int B[ ...

  4. csu 1798(树上最远点对,线段树+lca)

    1798: 小Z的城市 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 60  Solved: 16[Submit][Status][Web Board] ...

  5. Java学习(运算符,引用数据类型)

    一.  运   算    符 1.算数运算符 运算符是用来计算数据的符号.数据可以是常量,也可以是变量.被运算符操作的数我们称为操作数. 算术运算符最常见的操作就是将操作数参与数学计算,具体使用看下图 ...

  6. WPF 获取指定文件的Icon

    C# var icon = System.Drawing.Icon.ExtractAssociatedIcon(@"filepath"); var m = new MemorySt ...

  7. Gitlab基本管理(二)

    一. Gitlab分支 1. 切换到项目位置. 2. 创建一个项目的一新分支. mike@win10-001 MINGW64 ~/cookbook/cookbook (master) $ git br ...

  8. SQL必知必会 -------- 通配符、计算字段、函数

    1.LIKE操作符 1.1百分号(%)通配符 SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%' 此例子使用了搜索 ...

  9. java中的静态绑定与动态绑定

    http://blog.csdn.net/u012420654/article/details/51945853 http://blog.csdn.net/zhangjk1993/article/de ...

  10. hdu 1253

    D - 胜利大逃亡 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...