很多时候我们都要保存文件到手机上
一般手机上 分为内置存储卡和外置存储卡
内置存储卡 分为 可见 和不可见
不可见的 一般都是 我们创建的 sqlite 数据库 等重要文件在这里面
当然你如果用的模拟器的时候可以在 data /data 目录下找到对应的(好像当初听老师说,手机有一个root权限的原因具体也记不清了,但是我root 完还是没有发现,如果有人知道请告诉我,小弟感激不尽、谢谢)
对于 可见部分
一般使用 Environment.getExternalStorageDirectory().getAbsolutePath() 就可以获取到根目录下
如果想要 获取到 手机内部公共存储 pictures、movies、musics 等
可以如下图Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()
DIRECTORY_PICTURES 换成对应的就好
对于外部存储卡
这个就比较蛋疼了 因为 android 底层相当于还是linux linux最大的特点感觉就是 存储空间是挂在系统上的
对于不同牌子的系统来说 挂的位置可能不一样
思路 就是绕过Android直接去读取Linux底层的挂载文件来找到系统中挂载的外置存储器
public static Map<String, File> getAllStorageLocations() {
Map<String, File> map = new HashMap<String, File>(10);
List<String> mMounts = new ArrayList<String>(10);
List<String> mVold = new ArrayList<String>(10);
mMounts.add("/mnt/sdcard");
mVold.add("/mnt/sdcard");
try {
File mountFile = new File("/proc/mounts");
if (mountFile.exists()) {
Scanner scanner = new Scanner(mountFile);
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (line.startsWith("/dev/block/vold/")) {
String[] lineElements = line.split(" ");
String element = lineElements[1];
// don't add the default mount path
// it's already in the list.
if (!element.equals("/mnt/sdcard"))
mMounts.add(element);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
try {
File voldFile = new File("/system/etc/vold.fstab");
if (voldFile.exists()) {
Scanner scanner = new Scanner(voldFile);
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (line.startsWith("dev_mount")) {
String[] lineElements = line.split(" ");
String element = lineElements[2];
if (element.contains(":"))
element = element.substring(0, element.indexOf(":"));
if (!element.equals("/mnt/sdcard"))
mVold.add(element);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < mMounts.size(); i++) {
String mount = mMounts.get(i);
if (!mVold.contains(mount))
mMounts.remove(i--);
}
mVold.clear();
List<String> mountHash = new ArrayList<String>(10);
for (String mount : mMounts) {
File root = new File(mount);
if (root.exists() && root.isDirectory() && root.canWrite()) {
File[] list = root.listFiles();
String hash = "[";
if (list != null) {
for (File f : list) {
hash += f.getName().hashCode() + ":" + f.length() + ", ";
}
}
hash += "]";
if (!mountHash.contains(hash)) {
String key = SD_CARD + "_" + map.size();
if (map.size() == 0) {
key = SD_CARD;
} else if (map.size() == 1) {
key = EXTERNAL_SD_CARD;
}
mountHash.add(hash);
map.put(key, root);
}
}
}
mMounts.clear();
if (map.isEmpty()) {
map.put(SD_CARD, Environment.getExternalStorageDirectory());
}
return map;
}
创建文件
可以使用File 的mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹
new File("/temp/one/two/three").mkdirs();
执行后, 会建立temp/one/two/three四级目录
new File("/temp/one/two/three").mkdir();
则不会建立任何目录, 因为找不到/temp/one/two目录, 结果返回false
举一个 保存图片的例子吧
public File saveBitmapFile(Bitmap bitmap, String i) {
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/who_face/");// 将要保存图片的路径
File file2 = null;
try {
if (!file.exists()) {
file.mkdirs();
}
file2 = new File(file, i + ".jpg");
file2.createNewFile();
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file2));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
return file2;
}
这样 先创建一个文件 再用流把内容写进去 就好了 其他类型的一样