文件存储适合按照从开始到结束的顺序不跳过地读取或写入大量数据。 例如,它适合于图像文件或通过网络交换的任何内容。文件存储分为内部存储和外部存储,内部存储将数据存到手机内存中,默认情况下其他应用无法访问此文件,并且卸载应用时会删除应用的所有文件;外部存储将数据存到SD卡中,文件是全局可读的,因此此处保存的文件可能不受您控制地被读取,卸载应用时必须调用getExternalFilesDir()方法才能将此应用的文件保存在目录中删除。
内部存储
- Context 类中的openFileOutput ()方法得到FileOutputStream 对象
- 构建出一个OutputStreamWriter 对象
- 构建出一个 BufferedWriter 对象
- 通过 BufferedWriter 来将文本内容写入到文件中
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/et1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Activity代码
public class MainActivity extends Activity {
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.et1);
String data = read();
if (!TextUtils.isEmpty(data)) {
mEditText.setText(data);
mEditText.setSelection(data.length());// 将光标移到文本末尾
}
}
@Override
protected void onDestroy() {
super.onDestroy();
String data = mEditText.getText().toString();// getText()返回的是Editable对象
save(data);
}
// 文件存储采用流的方式,先得到输出流,参数有指定的输出文件,再用输出流构建一个BufferedWriter,然后写数据
public void save(String data) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
/*
* openFileOutput()方法得到一个FileOutputStream对象
* 第一个参数是文件名,文件默认存储到/data/data/<packagename>/files/目录
* 第二个参数是操作模式,MODE_PRIVATE表示新写入的内容将会覆盖原文件中的内容,MODE_APPEND表示向原文件追加内容
*/
out = openFileOutput("filesave", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 读取数据
public String read() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder builder = new StringBuilder();
try {
in = openFileInput("filesave");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return builder.toString();// 将StringBuilder转换为String类型
}
}
外部存储
- 判断是否有sd卡
- sd卡目录
- sd卡剩余存储空间是否足够
Android实现SD卡和实现内部文件存储的做法基本是一样的。只是取得文件路径的方法不一样,并且需要某些权限。
所需权限:
<!--在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 从SDCard读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
判断是否有sd卡:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) //已经挂载sd卡,可以进行读写
得到sd卡目录:
File sdFile = Environment.getExternalStorageDirectory();
判断剩余空间:
// 获得sd卡的内存状态
File sdcardFileDir = Environment.getExternalStorageDirectory();
String sdcardMemory = getMemoryInfo(sdcardFileDir);
// 获得手机内部存储控件的状态
File dataFileDir = Environment.getDataDirectory();
String dataMemory = getMemoryInfo(dataFileDir);
//根据路径获取内存状态:
private String getMemoryInfo(File path) {
// 获得一个磁盘状态对象
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize(); // 获得一个扇区的大小
long totalBlocks = stat.getBlockCount(); // 获得扇区的总数
long availableBlocks = stat.getAvailableBlocks(); // 获得可用的扇区数量
// 总空间
String totalMemory = Formatter.formatFileSize(this, totalBlocks * blockSize);
// 可用空间
String availableMemory = Formatter.formatFileSize(this, availableBlocks * blockSize);
return "总空间: " + totalMemory + "\n可用空间: " + availableMemory;
}