以下内容参考develoer.android.com
安卓存储文件
内部存储:
在内部存储器,ddms查看在data/data目录下,每个app对应一个目录,一般apk安装后就在这个目录下,但如果apk过大也会安装到外部存储器.
外部存储:
一般是以SD卡形式.在mnt/sdcard目录或storage/emulated/0目录下
内部存储和外部存储区别
内部存储:
- 它始终可用。 默认情况下只有您的应用可以访问此处保存的文件。
- 当用户卸载您的应用时,系统会从内部存储中删除您的应用的所有文件。
- 当您希望确保用户或其他应用均无法访问您的文件时,内部存储是最佳选择。
外部存储:
- 它并非始终可用,因为用户可采用 USB 存储的形式装载外部存储,并在某些情况下会从设备中将其删除。
- 它是全局可读的,因此此处保存的文件可能不受您控制地被读取。
- 当用户卸载您的应用时,只有在您通过 getExternalFilesDir() 将您的应用的文件保存在目录中时,系统才会从此处删除您的应用的文件。
- 对于无需访问限制以及您希望与其他应用共享或允许用户使用电脑访问的文件,外部存储是最佳位置。
个人一点总结:
关于内部存储的一般使用context.getXXXdir获取文件目录,外部存储使用Environment.getExternalStorageXXX;
自己应用的包括在 data/data/包名 或 SD卡中Android/data/包名 目录下.
例子
贴一个关于在设备的各个文件目录下,创建文件或者创建目录的例子。
最简单也是最重要的先上:
权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
布局很简单,一看图就会:
主要代码:
package com.example.savefile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
private Button btn5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initButton();
}
private void initButton() {
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
btn4 = (Button) findViewById(R.id.btn4);
btn5 = (Button) findViewById(R.id.btn5);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
}
/**
* 往data/包名/files/ 路径下创建文本文件
*/
private void btn1Pressed() {
String fileName = "iwfu_file1.txt";
// getFileDir()--返回应用的内部目录
File file = new File(this.getFilesDir(), fileName);
// 要写入的文本
String text = "Hello Android~";
try {
FileOutputStream outputStream = openFileOutput(fileName,
MODE_PRIVATE);
outputStream.write(text.getBytes());
outputStream.close();
Toast("往data/包名/files/ 路径下创建文本文件成功,注意查收");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从 URL 提取文件名并在您的应用的内部缓存目录中以该名称创建文件
*/
private void btn2Pressed() {
File file;
String url = "http://www.iwfu.io/iwfu.txt";
String fileName = Uri.parse(url).getLastPathSegment();
try {
file = File.createTempFile(fileName, null, getCacheDir());
Toast("创建缓存文件成功,注意查收");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 判断外部存储(SD卡)是否可用,可读或可写,若可用就在sd卡目录创建一个文件
*/
private void btn3Pressed() {
// 获取sd卡状态
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
File file = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath(), "IwfuSDFile.txt");
Toast("sd卡创建文件成功");
// TODO do something..
}
}
/**
* 使用 getExternalStoragePublicDirectory() 方法获取表示外部存储上相应目录的 File 。该方法使用指定
* 您想要保存以便它们可以与其他公共文件在逻辑上组织在一起的文件类型的参数,比如 DIRECTORY_MUSIC 或
* DIRECTORY_PICTURES
*
* 就是获取sd卡已有的公用的,像 照片,音乐,电影目录
*/
private void btn4Pressed() {
// 在sd卡自带的Picture目录下创建一个目录iwfu
File file = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"iwfu");
if (!file.exists()) {
file.mkdir();
Toast("在Sd卡picture创建目录成功");
}
}
/**
* 如果您要保存您的应用专用文件,您可以通过调用 getExternalFilesDir() 获取相应的目录并向其传递指示您想要的目录类型的名称。
* 通过这种方法创建的各个目录将添加至封装您的应用的所有外部存储文件的父目录,当用户卸载您的应用时,系统会删除这些文件。
*
* 即:在sd卡Android/data/包名目录下创建个人相册的目录
*/
private void btn5Pressed() {
File file = new File(
this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
"iwfuAlbum");
if (!file.mkdir()) {
Toast("创建目录失败");
} else {
Toast("创建目录成功");
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn1:
btn1Pressed();
break;
case R.id.btn2:
btn2Pressed();
break;
case R.id.btn3:
btn3Pressed();
break;
case R.id.btn4:
btn4Pressed();
break;
case R.id.btn5:
btn5Pressed();
break;
default:
break;
}
}
private void Toast(String msg) {
android.widget.Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
最后感谢你能看到这里~~