1、使用内部存储器
你可以直接保存文件在设备的内部存储。默认情况下,文件保存在你的应用程序的内部存储,其他应用程序或用户不能访问。当用户卸载你的应用城西是,这些文件被删除。
(一)在内部存储创建并写入私有文件:
(1)调用openFileOutputStream(name,model)方法,返回一个FileOutputStream,name参数用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,会自动创建它。创建的文件保存在/data/data/<package name>/files/目录中,model参数指的是使用模式,分别有:
MODE_PRIVATE:私有(创建此文件的应用能够使用,其他应用不能访问),写入文件会覆盖原来的内容
MODE_APPEND:私有,在原有内容上增加数据
(2)调用write方法把数据写入文件
(3)调用close方法关闭流
/** * 写入私有文件 * @param view */ public void writePrivateFile(View view) { try { OutputStream out = openFileOutput("ake.tex", Context.MODE_PRIVATE); String info = "我是中国人"; byte[] bytes = info.getBytes(); //写入 out.write(bytes, 0, bytes.length); out.close(); } catch (Exception e) { e.printStackTrace(); } }
读取私有文件:
/** * 读取私有文件 * * @param view */ public void readPrivateFile(View view) { try { InputStream inputStream = openFileInput("test.txt"); byte[] bytes = new byte[1024]; StringBuffer sb = new StringBuffer(); int len = -1; while ((len = inputStream.read(bytes)) != -1) { sb.append(new String(bytes, 0, len)); } inputStream.close(); Toast.makeText(MainActivity.this, sb, Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }
保存内部缓存文件:
如果你想缓存一些数据,而不是永久保存,可以使用getCacheDir()打开文件所在的目录,代表内部应用程序应保存临时缓存文件。
当设备的内部存储空间低,Android可以删除这些缓存文件以回收空间。然而,你不应该依赖系统清除这些文件,应该自己维护缓存文件,并保持在一个合理的小号空间的限制,如1M,当用户卸载应用时,这些文件被删除。
通过getCacheDir()获取的目录为:/data/data/<package name>/cache
/** * 写入一个缓存文件 * @param view */ public void writePrivateCacheData(View view) { // String file = getCacheDir() + "/temp.tap"; try { //创建一个缓存的文件路径 File temp = File.createTempFile("temp.tmp", null, getCacheDir()); FileOutputStream out = new FileOutputStream(temp); PrintStream ps = new PrintStream(out); ps.print("测试测试测试"); ps.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } }
其他有用的方法:
getFileDir() 获取私有文件目录:/data/data/<package name>/files
getDiary() 创建(或打开已存在的) 目录:/data/data/<package name>/app_<文件名>
deleteFile(name) 删除私有目录的文件 :/data/data/<package name>/files
fileList() 获取/data/data/<package name>/files目录的文件名数组
2、使用外部存储器(SD卡)
所有兼容Android的设备都支持一个可共享的“外部存储”(external storage),可用来保存文件。这可以使一个可移动的存储设备(比如SD卡)或者一个内部的(不可移动的)存储。保存在外部存储的文件是可读的。并且当用于传输数据的USB大容量存储选项启动时,用户能够在计算机上修改它们
(一)获取外部存储权限
为了在外部存储或写文件,必须要获得android.permission.READ_EXTERNAL_STORAGE或android.permission.WRITE_EXTERNAL_STORAGE系统权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
既要读也要写权限,柯旭添加WRITE_EXTERNAL_STORAGE即可
(二)检查媒体的可用性
在使用外部存储来保存数据时,我们应该使用getExternalStorageState()来检查当前设备是否存在外部存储设备(SDCard),否则将会发生意外。
public void isSDCard(View view) { //判断是否有SD卡 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(MainActivity.this, "有SD卡", Toast.LENGTH_SHORT).show(); //是否只读 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { Toast.makeText(MainActivity.this, "SD卡是只读的", Toast.LENGTH_SHORT).show(); } //获取SD卡的路径 //Environment.getExternalStorageDirectory().getPath(); } else { Toast.makeText(MainActivity.this, "没有SD卡", Toast.LENGTH_SHORT).show(); } }
(三)外部存储保存私有缓存文件
通过Context.getExternalFileDir()方法可以获取到SDCard/Android/data/你的应用包名/files/目录,一般放一些长时间保存的数据。
通过Context.getExternalCacheDir()方法可以获取到SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用包名/这个迷路下的所有文件都会被删除,不会留下垃圾信息。
而且上面两个目录分别对应 设置-应用-应用详情里面的“清除数据”与“清除缓存”选项。