android之文件存储路径问题

很多时候我们都要保存文件到手机上

一般手机上 分为内置存储卡和外置存储卡

内置存储卡  分为  可见 和不可见

不可见的 一般都是 我们创建的 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;
	}

这样 先创建一个文件 再用流把内容写进去 就好了 其他类型的一样


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值