转载请注明出处:http://blog.csdn.net/magic_jss/article/details/52746142;
国庆小长假已经接近尾声了,感觉还没开始呢就已经结束了!期间生物钟完全被打破,晚睡晚起计划泡汤各种泡汤真的不能再这样下去了 我决心戒掉拖延症,做个言出必行,行之必果的人。此文为鉴!!!
1、概述
Android中数据存储的分类:
- 内部存储
- 外部存储
- 数据库存储(SQLite)
- SharedPreferences存储(可参考:http://blog.csdn.net/magic_jss/article/details/52744430)
本文只讲解内部存储、外部存储,其他两种方式可参考其他资料,数据库存储和SharedPreferences存储数据也保存到内部存储空间之中。其实Android中的数据储存,就是借助sdk提供的某些类获取某些路径,然后进行IO流操作。如果对IO流及File文件操作不是很了解可以分别参考http://blog.csdn.net/magic_jss/article/details/51475923,http://blog.csdn.net/magic_jss/article/details/51472205。
2、内部存储
内部存储:手机出厂前被内置的存储空间,空间有限,比如常说的32G、64G等。相当于我们PC的硬盘(可能比喻不是很恰当)内部存储不是运行内存。一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。内部存储一般用Context上下文来获取和操作,其方法的具体实现在ContextImpl类中。
常用方法:
context.getFilesDir();
// /data/data/包名/files
该方法返回应用程序的文件目录对象。
context.getDir("magic", Context.MODE_PRIVATE);
// /data/data/包名/app_magic
该方法返回应用程序用于请求的目录的文件对象。如果它不存在,则该目录将被创建。参数二为操作模式,使用mode_private为默认操作,mode_world_readable和mode_world_writeable权限控制。
操作模式分类:
- Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
- Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
- Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
- Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
context.getCacheDir();
// /data/data/包名/cache
该方法返回在文件系统上应用程序特定的缓存目录的绝对路径。
context.getDatabasePath("magic");
// /data/data/包名/databases/magic
该方法返回在文件系统上应用程序特定的数据库文件绝对路径。参数是数据库的名称。
context.getFileStreamPath("magic");
// /data/data/包名/files/magic
该方法返回getFilesDir()目录下的文件,参数为文件名。
// 删除指定文件名的内存存储文件
context.deleteFile("magic");
// 打开与此上下文相关联的应用程序包的一个私有文件
context.openFileInput("");
// 打开与此上下文相关联的应用程序包的一个私有文件。如果不存在则创建。
context.openFileOutput("", mode);
这两个方法内部都调用了getFilesDir()方法。
先看布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|top" />
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="保存文件" />
</LinearLayout>
MainActivity.java
/**
* Created by magic on 2015年3月23日.内部存储
*/
public class MainActivity extends Activity {
private EditText editText;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText) findViewById(R.id.editText);
button = (Button) findViewById(R.id.button);
// 读取数据
readData();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// 保存数据
savaData();
}
});
}
/**
* 读取内部存储数据
*/
public void readData() {
try {
// 获得输入流对象 data为文件名"
InputStream inputStream = openFileInput("data");
// inputStream.available()获取文件的总大小
byte[] bytes = new byte[inputStream.available()];
// 将数据读入字节数组 bytes
inputStream.read(bytes);
// 关闭流
inputStream.close();
String s = new String(bytes, "utf-8");
Toast.makeText(this, "" + s, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 保存到内部数据
*/
public void savaData() {
try {
// 获得输出流对象 第一个参数为"文件名" 第二个参数为文件可读性
OutputStream outputStream = openFileOutput("data",Context.MODE_PRIVATE);
// 写入数据
outputStream.write(editText.getText().toString().getBytes("utf-8"));
// 刷新 清空缓存区
outputStream.flush();
// 关闭流
outputStream.close();
Toast.makeText(this, "success!", Toast.LENGTH_SHORT).show();
return;
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(this, "fail!", Toast.LENGTH_SHORT).show();
}
}
3、外部存储
外部存储:SD卡存储,将数据存储到SdCard。
使用先添加权限:
<uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
MainActivity.java
/**
* Created by magic on 2015年3月23日.外部存储
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 得到外部存储的文件或者路径
File dir = Environment.getExternalStorageDirectory();
// 新建file对象
File file = new File(dir, "myfile.txt");
try {
// 判断文件是否存在
if (!file.exists()) {
// 创建新的文件
file.createNewFile();
}
// 得到输出流对象 输出字符串数据
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(new String("hello world!!").toString().getBytes(
"utf-8"));
// 刷新缓冲区
outputStream.flush();
// 关闭流
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
// 得到输入流对象
@SuppressWarnings("resource")
FileInputStream inputStream = new FileInputStream(file);
try {
// 字节数组
byte[] bytes = new byte[inputStream.available()];
// 读入数据到程序中
inputStream.read(bytes);
String s = new String(bytes);
Toast.makeText(this, s, 1).show();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
由于外部存储使用频率较高,简单封装了个工具类方便使用。
/**
* Created by magic on 2015年3月23日.文件操作工具类
*/
public class FileUtils {
private String SDPATH;
public String getSDPATH() {
return SDPATH;
}
public FileUtils() {
// 得到外部存储设备的目录
SDPATH = Environment.getExternalStorageDirectory().getAbsolutePath();
System.out.println(SDPATH);
}
/**
* 在SD卡上创建文件
*/
public File creatSDFile(String fileName, String dir) throws IOException {
File file = new File(SDPATH + File.separator + dir + File.separator
+ fileName);
file.createNewFile();
return file;
}
/**
* 在SD卡上创建目录
*/
public File creatSDDir(String dirName) {
File dir = new File(SDPATH + File.separator + dirName);
dir.mkdirs();
return dir;
}
/**
* 判断SD卡上的文件夹是否存在
*/
public boolean isFileExist(String fileName, String path) {
File file = new File(SDPATH + File.separator + path + File.separator
+ fileName);
return file.exists();
}
/**
* 将一个InputStream里面的数据写入到SD卡中
*/
public File write2SDFromInput(String path, String fileName,
InputStream input) {
File file = null;
OutputStream output = null;
try {
creatSDDir(path);
file = creatSDFile(fileName, path);
output = new FileOutputStream(file);
byte buffer[] = new byte[4 * 1024];
int temp;
while ((temp = input.read(buffer)) != -1) {
output.write(buffer, 0, temp);
}
output.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
}
若有问题恳请指正,欢迎留言交流!
删繁就简,轻装上阵。未来你好!