Android5中存储方式之文件外部存储SDCard存储
文件外部存储SDCard存储
特征:
1、存储类型也是任意的,文档、图片、音频、视频
2、存储位置:
路径1:/mnt/sdcard/文件
路径2:/mnt/sdcard/Android/data/应用的包名/文件
/storage/sdcard1/
3、适合存储 公开的数据
注意:
4、两种路径存储需要权限
write_external_storage
read_external_storage
5、两种路径必须保证sdcard是挂载的
提供了对应api 判断sdcard是否正常挂载
if(Enviroment.getExternalStorageState()==”mounted”}{
挂载
}
保存步骤:
1、获取 外部存储的路径 ★
路径一:
Environment.getExternalStorageDirectory()
路径二:
this.getExternalFilesDir(null);
2、创建输出流对象
3、写入
4、关闭流
读取步骤
1、获取 外部存储的路径
路径一:
Environment.getExternalStorageDirectory()
路径二:
this.getExternalFilesDir(null);
2、创建输入流对象
3、读取
4、关闭流
外部存储和内部储存方式的对比
相同点:
存储的数据格式一样,都是任意
不同点:
1、存储位置不同
2、存储的速度 不同
文件内部存储相对要快一点
3、较大的文件存到文件内部file,导致 应用非常大,一个应用apk本身有大小限制 ,现在100M。
.xml
<EditText
android:id="@+id/et_file"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="27dp"
android:layout_marginTop="16dp"
android:ems="10" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/et_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/et_file"
android:layout_below="@+id/et_file"
android:layout_marginTop="25dp"
android:ems="10" />
<Button
android:onClick="save1"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/et_content"
android:layout_below="@+id/et_content"
android:layout_marginTop="29dp"
android:text="保存1" />
<Button
android:onClick="read1"
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button1"
android:layout_alignBottom="@+id/button1"
android:layout_alignRight="@+id/et_content"
android:text="读取1" />
<Button
android:onClick="save2"
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_below="@+id/button1"
android:text="保存2" />
<Button
android:onClick="read2"
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button3"
android:layout_alignBottom="@+id/button3"
android:layout_alignLeft="@+id/button2"
android:layout_below="@+id/button2"
android:text="读取2" />
.java
public class MainActivity extends ActionBarActivity {
private EditText et_file;
private EditText et_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_file = (EditText) findViewById(R.id.et_file);
et_content = (EditText) findViewById(R.id.et_content);
}
/*
* 保存在 sdcard 的路径1 /mnt/sdcard/文件
*/
public void save1(View view) throws IOException {
// 获取输入的文件名和文件内容
String filename = et_file.getText().toString();
String content = et_content.getText().toString();
// 1.获取文件全路径
// 获取外部存储设备的路径,不包含文件名
File path = Environment.getExternalStorageDirectory();
// 创建一个File对象 指向 指定文件的全路径,包含文件名
File file = new File(path, filename);
// 2.创建输出流对象
FileOutputStream fos = new FileOutputStream(file);
// 3.写入
fos.write(content.getBytes());
// 4.关闭流
fos.close();
//置空输入框
et_file.setText(null);
et_content.setText(null);
}
/*
* 保存在 sdcard 的路径2
*/
public void save2(View view) throws IOException {
// 获取输入的文件名和文件内容
String filename = et_file.getText().toString();
String content = et_content.getText().toString();
// 1.获取文件全路径
// 获取外部存储设备的路径,不包含文件名
File path = getExternalFilesDir(null);
// 创建一个File对象 指向 指定文件的全路径,包含文件名
File file = new File(path, filename);
// 2.创建输出流对象
FileOutputStream fos = new FileOutputStream(file);
// 3.写入
fos.write(content.getBytes());
// 4.关闭流
fos.close();
//置空输入框
et_file.setText(null);
et_content.setText(null);
}
/*
* 读取 sdcard 路径1的文件内容
*/
public void read1(View view) throws IOException {
// 获取输入的文件名和文件内容
String filename = et_file.getText().toString();
// 1.获取文件全路径
// 获取外部存储设备的路径,不包含文件名
File path = Environment.getExternalStorageDirectory();
// 创建一个File对象 指向 指定文件的全路径,包含文件名
File file = new File(path, filename);
if ("".equals(filename)) {
Toast.makeText(this, "文件未指定", 0).show();
return;
}
if (!file.exists()) {
Toast.makeText(this, "文件不存在", 0).show();
et_file.setText(null);
et_file.requestFocus();
return;
}
//判断sdcard是否挂载
if (Environment.getExternalStorageState().equals("mounted")) {//★★★★★★
FileInputStream fis = new FileInputStream(file);
String content = StreamUtils.streamToString(fis);
et_content.setText(content);
}
}
/*
* 读取 sdcard 路径2的文件内容
*/
public void read2(View view) throws IOException {
// 获取输入的文件名和文件内容
String filename = et_file.getText().toString();
// 1.获取文件全路径
// 获取外部存储设备的路径,不包含文件名
File path = getExternalFilesDir(null);
// 创建一个File对象 指向 指定文件的全路径,包含文件名
File file = new File(path, filename);
if ("".equals(filename)) {
Toast.makeText(this, "文件未指定", 0).show();
return;
}
if (!file.exists()) {
Toast.makeText(this, "文件不存在", 0).show();
et_file.setText(null);
et_file.requestFocus();
return;
}
//判断sdcard是否挂载
if (Environment.getExternalStorageState().equals("mounted")) {//★★★★★★
FileInputStream fis = new FileInputStream(file);
String content = StreamUtils.streamToString(fis);
et_content.setText(content);
}
}
}`