数据存储——手机外部文件存储
一.特点
1.把文件存储在手机外部存储空间(SD卡)里
2.存储的是任意类型的文件
3.使用IO输入输出流操作文件
4.存放路径
①SD卡根目录/Android/date/包名/files/[文件类型目录]:应用卸载之后,数据同时被删除
②SD卡根目录/:应用卸载之后,数据不会同时被删除
5.需要声明权限
①写入文件android.permission.WRITE_EXTERNAL_STORAGE
②创建和删除文件MOUNT_UNMOUNT_FILESYSTEMS
二.API
1.Environment
①SD卡的工具类
②getExternalStorageState() SD卡的状态 :Environment.MEDIA_MOUNTED 挂载状态
③getExternalStorageDirectory() 得到SD卡的根目录File实例
2.context.getExternalFilesDir(type) 得到包名的外部存储路径
type 文件类型目录
①null 表示不创建类型子目录
②会根据类型创建相应的子目录
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="com.hanqi.testapp3.MainActivity" 11 android:orientation="vertical"> 12 <Button 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 android:text="写入外部存储文件" 16 android:onClick="bt6_OnClick"/> 17 <Button 18 android:layout_width="match_parent" 19 android:layout_height="wrap_content" 20 android:text="读外部存储文件" 21 android:onClick="bt7_OnClick"/> 22 23 </LinearLayout>
1 package com.hanqi.testapp3; 2 3 import android.content.SharedPreferences; 4 import android.content.res.AssetManager; 5 import android.graphics.Bitmap; 6 import android.graphics.BitmapFactory; 7 import android.os.Bundle; 8 import android.os.Environment; 9 import android.support.v7.app.AppCompatActivity; 10 import android.view.View; 11 import android.widget.EditText; 12 import android.widget.ImageView; 13 import android.widget.TextView; 14 import android.widget.Toast; 15 16 import java.io.File; 17 import java.io.FileInputStream; 18 import java.io.FileOutputStream; 19 import java.io.InputStream; 20 import java.io.PrintStream; 21 22 public class MainActivity extends AppCompatActivity { 23 24 EditText et_1; 25 TextView tv_1; 26 ImageView iv_1; 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 setContentView(R.layout.activity_main); 32 33 et_1=(EditText)findViewById(R.id.et_1); 34 tv_1=(TextView)findViewById(R.id.tv_1); 35 iv_1=(ImageView)findViewById(R.id.iv_1); 36 } 37 38 39 //写入外部存储文件 40 public void bt6_OnClick(View v) 41 { 42 //1.判断SD是否挂载 43 44 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 45 { 46 //文本框内容 47 String str=et_1.getText().toString(); 48 49 try { 50 //写入 51 //1.构造输出流 52 //1)得到文件路径 53 54 //得到SD卡根目录 55 String path=Environment.getExternalStorageDirectory().getCanonicalPath(); 56 57 //得到包名对应的目录 58 //String path=getExternalFilesDir("Music").getCanonicalPath(); 59 60 Toast.makeText(MainActivity.this, "path="+path, Toast.LENGTH_LONG).show(); 61 62 //2)构造 63 FileOutputStream fos = new FileOutputStream(path+"/test.txt"); 64 65 PrintStream ps=new PrintStream(fos); 66 67 ps.print(str); 68 69 ps.close(); 70 fos.close(); 71 72 Toast.makeText(MainActivity.this, "写入外部文件成功", Toast.LENGTH_SHORT).show(); 73 } 74 catch (Exception ex) 75 { 76 ex.printStackTrace(); 77 Toast.makeText(MainActivity.this, "存储文件出错", Toast.LENGTH_SHORT).show(); 78 } 79 } 80 else 81 { 82 Toast.makeText(MainActivity.this, "SD卡没有挂载", Toast.LENGTH_SHORT).show(); 83 } 84 } 85 86 public void bt7_OnClick(View v) 87 { 88 //1.判断SD是否挂载 89 90 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 91 { 92 try { 93 94 String path = getExternalFilesDir("Music").getCanonicalPath() + "/test.txt"; 95 96 FileInputStream fis=new FileInputStream(path); 97 98 byte[]b=new byte[1024]; 99 int i=0; 100 101 String str=""; 102 103 while ((i=fis.read(b))>0) 104 { 105 str+=new String(b,0,i); 106 } 107 108 fis.close(); 109 110 Toast.makeText(MainActivity.this, "文件内容="+str, Toast.LENGTH_SHORT).show(); 111 } 112 catch (Exception ex) 113 { 114 Toast.makeText(MainActivity.this, "读取外部文件失败", Toast.LENGTH_SHORT).show(); 115 } 116 } 117 else 118 { 119 Toast.makeText(MainActivity.this, "SD卡没有挂载", Toast.LENGTH_SHORT).show(); 120 } 121 } 122 }