可通过Environment.getDataDirectory()得到手机内部文件的目录,为/data/data
(1).文件操作模式
默认存放至/data/data/<package name>/files
操作模式
说明
Context.MODE_APPEND
如果文件存在,直接向文件的末尾写入数据,而不是擦除这个文件。否则创建文件
Context.MODE_PRIVATE
该模式为默认创建模式,只有本应用(需要相同的userid)才能访问该文件。
Context.MODE_WORLD_READABLE
允许其它程序可读,在API level 17中已经过时,该模式存在很大的安全漏洞,可以通过比如ContentProvider, BroadcastReceiver, and Service达到同样的目的。
Context.MODE_WORLD_WRITEABLE
允许其它程序可写,在API level 17中已经过时,存在安全隐患。
Android有一套自己的安全模型,当应用程序安装时系统就会为该应用程序分配一个userid,当该应用要去访问其它资源时,就需要userid匹配,默认情况下,任何应用程序创建文件(file文件, sharedpreferences, 数据库),都应私有,不可以被其它应用程序访问。除非指定可读可写模式,但是最后不要这样操作,有安全隐患!
(2).常见操作的流对象
// 1.得到文件输出流 FileOutputStream fo = getContext().openFileOutput(filename, Context.MODE_PRIVATE); // 2.得到文件输入流 FileInputStream fi = MainActivity2.this.openFileInput(filename); // 3.得到files目录下指定的文件 File file = this.getFileStreamPath(filename);(3).操作实例
// 1.保存文件操作 saveButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String filename = filenameEdit.getText().toString(); String content = fileContentEdit.getText().toString(); if ("".equals(filename) || "".equals(content)) { Toast.makeText(MainActivity2.this, "请完整输入!", Toast.LENGTH_SHORT).show(); return; } try { save(filename, content); Toast.makeText(MainActivity2.this, "保存成功!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(MainActivity2.this, "保存失败!", Toast.LENGTH_SHORT).show(); } } private void save(String filename, String content) throws Exception { //打开文件或者创建 默认目录下的filename文件 FileOutputStream fo = MainActivity2.this.openFileOutput( filename, Context.MODE_PRIVATE); //文件的操作模式 fo.write(content.getBytes()); //想输出流写入数据 fo.close(); //关闭流对象 } }); // 2.读取文件操作 openButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String filename = filenameEdit.getText().toString(); if ("".equals(filename)) { Toast.makeText(MainActivity2.this, "请完整输入!", Toast.LENGTH_SHORT).show(); return; } try { byte[] bytes = read(filename); fileContentEdit.setText(new String(bytes)); } catch (FileNotFoundException e) { Toast.makeText(MainActivity2.this, "文件不存在!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(MainActivity2.this, "读取失败!", Toast.LENGTH_SHORT).show(); } Toast.makeText(MainActivity2.this, "读取成功!", Toast.LENGTH_SHORT) .show(); } private byte[] read(String filename) throws FileNotFoundException, Exception { //打开文件或者创建 默认目录下的filename文件,得到输入流对象 FileInputStream fi = MainActivity2.this.openFileInput(filename); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len = -1; byte[] buffer = new byte[1024]; while ((len = fi.read(buffer)) != -1) { bos.write(buffer, 0, len); } return bos.toByteArray(); //得到字节码文件 } }); // 3.删除files目录下指定的文件 deleteButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String filename = filenameEdit.getText().toString(); if ("".equals(filename)) { Toast.makeText(MainActivity2.this, "请完整输入!", Toast.LENGTH_SHORT).show(); return; } if (delete(filename)) { Toast.makeText(MainActivity2.this, "删除成功!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity2.this, "删除失败!", Toast.LENGTH_SHORT).show(); } } }); private boolean delete(String filename) { //得到files目录下指定的文件 File file = this.getFileStreamPath(filename); return file.delete(); //删除文件 } }
可通过Environment.getExternalStorageDirectory()得到SDcard目录,为/mnt/scard
(1).操作权限
android.permission.READ_EXTERNAL_STORAGE <!-- Android 4.1 允许应用从SD中读取文件信息,在Android 4.1及以上版本需要声明该权限,为确保以后程序的正确运行,需要声明该权限! --> android.permission.WRITE_EXTERNAL_STORAGE <!-- targetSdkVersion 4 允许应用向SD写入文件信息,在targetSdkVersion 4版本及以上版本需要声明该权限-->(2).常见细节
除上面需要声明的用户权限外,保存至SD卡,应该首先判断外设是否可读写,在通过Environment.getExternalStorageDirectory()得到外设的目录。
// 1.得到外存储设备的状态 String state = Environment.getExternalStorageState(); // 2.判断当前的状态是否可读写 if (Environment.MEDIA_MOUNTED.equals(state)) { // 3.得到外存储设备的目录 File file = new File(Environment.getExternalStorageDirectory(), filename); // 操作... }(3).操作实例
openButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String filename = filenameEdit.getText().toString(); if("".equals(filename)){ Toast.makeText(MainActivity.this, "请完整输入!", Toast.LENGTH_SHORT).show(); return; } try { byte[] bytes = read(filename); fileContentEdit.setText(new String(bytes)); } catch (FileNotFoundException e) { Toast.makeText(MainActivity.this, "文件不存在!", Toast.LENGTH_SHORT).show(); }catch (Exception e) { Toast.makeText(MainActivity.this, "读取失败!", Toast.LENGTH_SHORT).show(); } Toast.makeText(MainActivity.this, "读取成功!", Toast.LENGTH_SHORT).show(); } private byte[] read(String filename) throws FileNotFoundException,Exception { // 1.得到外存储设备的状态 String state = Environment.getExternalStorageState(); // 2.判断当前的状态是否可读写 if (Environment.MEDIA_MOUNTED.equals(state)) { // 3.得到外存储设备的目录 File file = new File(Environment.getExternalStorageDirectory(), filename); // 4.流操作 FileInputStream fi = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len = -1; byte[] buffer = new byte[1024]; while ((len = fi.read(buffer)) != -1) { bos.write(buffer, 0, len); } return bos.toByteArray(); } return null; } });
public void getSize(){ // 1.得到手机内存的根目录 File file = Environment.getDataDirectory(); // 2.创建StatFs对象 StatFs statFs = new StatFs(file.getPath()); // 3.根据statFs得到需要信息 int blockSize = statFs.getBlockSize(); // 一个block的大小 int totalBlock = statFs.getBlockCount(); // 总共的block数目 int availBlock = statFs.getAvailableBlocks(); // 当前可用的block数目 // 4.输出容量信息 String avail = Formatter.formatFileSize(MainActivity.this, blockSize*availBlock); // 大小*可用数目 String total = Formatter.formatFileSize(MainActivity.this, blockSize*totalBlock); // 大小*总数目 fileContentEdit.setText(avail+"\n"+total); }