版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

创建缓存目录

    public static String APP_CACHE = "";//   /storage/emulated/0/Android/data/{package}/cache/
public static String IMAGE = "";// /storage/emulated/0/Android/data/{package}/cache/image
public static String CAMERA = "";// /storage/emulated/0/Android/data/{package}/cache/camera
public static String GIF = "";// /storage/emulated/0/Android/data/{package}/cache/gif
public static String FUND = "";// /storage/emulated/0/Android/data/{package}/cache/fund
public static String CRASH = "";// /storage/emulated/0/Android/data/{package}/files/crash
public static String PLAYER = "";// /storage/emulated/0/Android/data/{package}/files/player
public static String P2P = "";// /storage/emulated/0/Android/data/{package}/files/p2p
public static String DOWNLOAD = "";// /storage/emulated/0/Android/data/{package}/files/download或者自定义的目录

  

注意:因为创建目录都是在/storage/emulated/0/Android/data/{package}目录中,所以本来不需要权限;但是下载目录有可能需要使用SD卡中的自定义目录,所以还是需要权限的。【20191124,不需要权限】

效果图

暂不需要

代码分析

AppDir : 自定义需要创建的缓存目录

FileUtils : 创建目录、删除目录下所有文件、获取目录下第一个文件path

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将AppDir、FileUtils复制到项目中

【20191124更新】

package com.why.project.appdirdemo.utils;

import android.content.Context;
import android.os.Build;
import android.os.Environment; import java.io.File; /**
* Created by HaiyuKing
* Used 创建缓存目录
* 安卓手机的存储分为 2 部分,内部存储 ( Internal ) 和外部存储( External ):
* 内部存储是指系统的存储空间,没有root是访问不到的呦亲,比如sharedPreferenced或者database都是保存在这里面的。
* 外部存储,又分为 2 部分:【操作外部存储你首先需要以下权限:WRITE_EXTERNAL_STORAGE,不过Android Q之后不再需要申请该权限】
* 机器自带的存储【ExternalStorage】,也就是手机厂商常说的16G,32G,64G之类的存储空间。
* SD卡,其实正确叫法应该是TF卡,就是可插拔的那个小东西。
* 参考资料:https://www.jianshu.com/p/116025bf51f7
*/ public class AppDir { public static final String TAG = AppDir.class.getName(); private static Context mContext; enum Type {
CACHE,FILE;
} public static String APP_CACHE = "";// /storage/emulated/0/Android/data/{package}/cache/
public static String IMAGE = "";// /storage/emulated/0/Android/data/{package}/cache/image
public static String CAMERA = "";// /storage/emulated/0/Android/data/{package}/cache/camera
public static String GIF = "";// /storage/emulated/0/Android/data/{package}/cache/gif
public static String FUND = "";// /storage/emulated/0/Android/data/{package}/cache/fund
public static String CRASH = "";// /storage/emulated/0/Android/data/{package}/files/crash
public static String PLAYER = "";// /storage/emulated/0/Android/data/{package}/files/player
public static String P2P = "";// /storage/emulated/0/Android/data/{package}/files/p2p
public static String DOWNLOAD = "";// /storage/emulated/0/Android/data/{package}/files/download或者自定义的目录 public static AppDir getInstance(Context mContext){
AppDir appDir = new AppDir();
appDir.mContext = mContext;
initDatas();
return appDir;
} private static void initDatas(){
APP_CACHE = createPath("APP_CACHE", 0, "", Type.CACHE);
IMAGE =createPath("IMAGE", 1, "image", Type.CACHE);
CAMERA = createPath("CAMERA", 2, "camera", Type.CACHE);
GIF = createPath("GIF", 3, "gif", Type.CACHE);
FUND = createPath("FUND", 4, "fund", Type.CACHE);
CRASH = createPath("CRASH", 5, "crash", Type.FILE);
PLAYER = createPath("PLAYER", 6, "player", Type.FILE);
P2P = createPath("P2P", 8, "p2p", Type.FILE);
//DOWNLOAD = createDownloadPath();//20191124,该方法不再使用
DOWNLOAD = createPath("download", 9, "download", Type.FILE);
} private static String createPath(String name, int index, String subpath, Type p) {
String cachePath = mContext.getExternalCacheDir() + File.separator;//一般存放临时缓存数据
String filePath = mContext.getExternalFilesDir(null) + File.separator;//一般放一些长时间保存的数据
String path = p == Type.CACHE ? cachePath + subpath : filePath + subpath; //Log.e(TAG,"{AppDir}name="+name+";path="+path);
FileUtils.makeDirs(path);//创建目录
return path;
} /**
* 20191124
* 这个方法不建议使用,留在这里作为备份*/
private static String createDownloadPath() {
String path = "";
// 判断sd卡是否存在
boolean sdCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
//Log.e(TAG,"{AppDir}sdCardExit="+sdCardExit);
if (sdCardExit) {
if(Build.VERSION.SDK_INT >= 19) {//如果版本大于19,则直接在缓存目录中创建download目录
File[] files = mContext.getExternalFilesDirs("download");
if(files != null && files.length >= 1 && files[0] != null) {
path = files[0].getAbsolutePath();// /storage/emulated/0/Android/data/{package}/files/download
}
}else {
path = Environment.getExternalStorageDirectory() + File.separator + "why/download";//使用自定义的download目录
}
}else{
path = Environment.getDataDirectory() + File.separator + "why/download";//使用自定义的download目录
}
//Log.e(TAG,"{AppDir}DOWNLOAD"+";path="+path);
FileUtils.makeDirs(path);//创建目录
return path;
} }

AppDir

package com.why.project.appdirdemo.utils;

import android.text.TextUtils;

import java.io.File;

/**
* Created by HaiyuKing
* Used 配合APPDir的文件工具类
*/ public class FileUtils { //创建目录
public static boolean makeDirs(String filePath) {
if (TextUtils.isEmpty(filePath)) {
return false;
} File folder = new File(filePath);
return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
} //获取目录名
public static String getFolderName(String filePath) { if (TextUtils.isEmpty(filePath)) {
return filePath;
} int filePosi = filePath.lastIndexOf(File.separator);
return (filePosi == -1) ? "" : filePath.substring(0, filePosi);
} /**删除所有文件*/
public static void deleteAllFile(String filePath)
{
if(!TextUtils.isEmpty(filePath)) {
deleteAllFiles(new File(filePath));
}
} /**删除所有文件*/
public static void deleteAllFiles(File root)
{
File[] arrayOfFile = root.listFiles();
if (arrayOfFile != null)
{
for(int j = 0;j < arrayOfFile.length;j++){
File file = arrayOfFile[j];
if (file.isDirectory())
{
deleteAllFiles(file);
file.delete();
}else if(file.exists()){
deleteAllFiles(file);
file.delete();
}
}
}
} /**获取第一个文件的完整路径*/
public static String firstFile(String parentPath){
File[] arrayOfFile = new File(parentPath).listFiles();
String firstFilePath = "";
if (arrayOfFile != null)
{
File file0 = arrayOfFile[0];
firstFilePath = file0.getPath();
}
return firstFilePath;
}
}

FileUtils

在AndroidManifest.xml文件中声明权限【20191124,不需要权限】

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.why.project.appdirdemo"> <!-- =================AppDir用到的权限========================== -->
<!-- 允许程序读取外部存储文件 -->
<!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>-->
<!-- 允许程序写入外部存储,如SD卡上写文件 -->
<!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>--> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application> </manifest>

添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

三、使用方法

package com.why.project.appdirdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import com.why.project.appdirdemo.utils.AppDir;
import com.why.project.appdirdemo.utils.FileUtils; import java.io.File; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String pngFilePath = AppDir.getInstance(this).IMAGE + File.separator + System.currentTimeMillis() + ".png";
Log.e(TAG,"pngFilePath="+pngFilePath);// /storage/emulated/0/Android/data/com.why.project.appdirdemo/cache/image/1507125270183.png //删除目录下所有文件
//FileUtils.deleteAllFile(AppDir.getInstance(this).IMAGE); //获取目录下第一个文件
//String pngPath = FileUtils.firstFile(AppDir.getInstance(this).IMAGE);
}
}

混淆配置

参考资料

暂时空缺

项目demo下载地址

暂不需要

AppDir【创建缓存目录】【建议使用这个工具类】的更多相关文章

  1. AppDir【创建缓存目录】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 创建缓存目录 public static String APP_CACHE = "";// /storage/e ...

  2. java使用io创建文件与删除文件的工具类

    java中对于文件的操作,是再常见不过了.以下代码是自己代码中所用到的工具类,仅供参考. import java.io.File; import java.io.IOException; /** * ...

  3. 一个具有缓存数据功能的HttpWebRequest工具类

    背景:一个公共站点中的数据,供其它子站点共享,为了提高性能,简单实现了Http 1.1的缓存功能 特点:可以缓存Html数据到内存中;缓存具有过期时间;缓存过期后,通过再确认的方式来决定是否更新缓存; ...

  4. 随笔分类 - Android之工具类

    Android之文件搜索工具类 /** * @detail 搜索sdcard文件 * @param 需要进行文件搜索的目录 * @param 过滤搜索文件类型 */ private void sear ...

  5. Jackson 工具类使用及配置指南

    目录 前言 Jackson使用工具类 Jackson配置属性 Jackson解析JSON数据 Jackson序列化Java对象 前言 Json数据格式这两年发展的很快,其声称相对XML格式有很对好处: ...

  6. Redis在JAVA中的运用(工具类)

    最近项目需要用redis在中间做缓存所以写了一个工具类作为练习用 redis版本:redis_version:3.0.504 用到阿里的解析JSON的库:fastjson import org.apa ...

  7. Collections -- 集合的工具类

    Collections是JDK针对集合提供的一个工具类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 1.搜索 如可以使用Collections提供的二分查找方法binarySe ...

  8. 单机版 RedisUtils({基本操作封装工具类})【三】

    <!--集成的RedisJAR--> <!--引入jedis需的jar包--> <dependency> <groupId>redis.clients& ...

  9. 单机版 JedisUtil({基本操作封装工具类})【二】

    <!--集成的RedisJAR--> <!--引入jedis需的jar包--> <dependency> <groupId>redis.clients& ...

随机推荐

  1. [转]Oracle左连接、右连接、全外连接以及(+)号用法

    原文地址:https://www.cnblogs.com/hehaiyang/p/4745897.html 阅读目录 1.准备工作 2.左外连接(LEFT OUTER JOIN/ LEFT JOIN) ...

  2. python开源项目聚合推荐【1】

    ******************************************************* 01项目名:unimatrix 功能介绍:Python模拟“黑客帝国”影片中的终端动画脚 ...

  3. 008-linux shell vim使用

    一.概述 vi: Visual Interface 可视化接口 vim: VI iMproved VI增强版 全屏编辑器,模式化编辑器 vim模式: 编辑模式(命令模式) 输入模式 末行模式 模式转换 ...

  4. full text search

    definition https://www.techopedia.com/definition/17113/full-text-search A full-text search is a comp ...

  5. LeetCode_476. Number Complement

    476. Number Complement Easy Given a positive integer, output its complement number. The complement s ...

  6. Nginx - 安装并启动Nginx

    1 - 安装Nginx 官网步骤:http://nginx.org/en/linux_packages.html#RHEL-CentOS [Anliven@h202 ~]$ sudo vim /etc ...

  7. springboot自定义类@Resource注入为null的问题

    最近用spring boot ,在controller外面即自定义的类里报错 java.lang.NullPointerException debug了下发现@Resource注入为null 查了不少 ...

  8. activiti学习2:示例工程activiti-explorer.war的使用

    目录 activiti学习2:示例工程activiti-explorer.war的使用 一.搭建开发环境 二.运行示例工程 三.示例工程功能演示 1. 创建流程图 2. 部署流程图 3. 启动流程 4 ...

  9. 利用MySQL存储过程批量插入100W条测试数据

    DROP PROCEDURE IF EXISTS insert_batch; CREATE PROCEDURE insert_batch() BEGIN ; loopname:LOOP '); ; T ...

  10. Go基础编程实践(十)—— 数据库

    从数据库中读取数据 在http://sqlitebrowser.org/下载sqlite3可视化工具,在本main.go同目录下创建personal.db数据库,创建表如下: package main ...