一、创建 Assets 目录
先创建一个文件,位于编译后的 class 文件目录。然后再把该文件的绝对路径做截取,便能得到项目在电脑上的绝对路径(每个项目在电脑上路径都不一样)。再拼接上 src/main/assets 便能实现 Assets目录JSON文件的创建了。
StandardLocation.CLASS_OUTPUT
:java 文件生成 class 文件的位置,/app/build/intermediates/javac/debug/classes/ 目录下
private final static String OUTPUT_FILE_NAME = "destination.json";
//获取路径:app/src/main/assets
try {
//filer.createResource()意思是创建源文件
//StandardLocation.CLASS_OUTPUT:
//java文件生成class文件的位置,/app/build/intermediates/javac/debug/classes/目录下
FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", OUTPUT_FILE_NAME);
String resourcePath = resource.toUri().getPath();
String appPath = resourcePath.substring(0, resourcePath.indexOf("app") + 4);
//...xxx/app/ + src/main/assets
String assetsPath = appPath + "src/main/assets";
File file = new File(assetsPath);
if (!file.exists()) {
file.mkdirs();
}
} catch (IOException e) {
e.printStackTrace();
}
二、获取 Assets 目录
方法一:通过全局 Application 获取
获取全局 Application
//ActivityThread 主进程的一个入口有 currentApplication 方法返回 Application
public static Application getApplication() {
Application sApplication;
if (sApplication == null) {
try {
//通过反射调用 ActivityThread.currentApplication();
Method method = Class.forName("android.app.ActivityThread").getDeclaredMethod("currentApplication");
sApplication = (Application) method.invoke(null, (Object) null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return sApplication;
}
获取 Assets 路径下的文件并读取 JSON 文件
private static String parseFile(String fileName) {
AssetManager assets = AppGlobals.getApplication().getResources().getAssets();
InputStream stream = null;
BufferedReader reader = null;
StringBuilder builder = new StringBuilder();
try {
stream = assets.open(fileName);
reader = new BufferedReader(new InputStreamReader(stream));
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (stream != null) {
stream.close();
}
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return builder.toString();
}
方法二:通过 Context 获取
获取路径读取 JSON 文件
//读取assets文件夹中的json文件,返回json字符串
public static String getJson(String fileName, Context context) {
//将json数据变成字符串
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bf = null;
try {
//获取assets资源管理器
AssetManager assetManager = context.getAssets();
//通过管理器打开文件并读取
BufferedReader bf = new BufferedReader(new InputStreamReader(
assetManager.open(fileName)));
String line;
while ((line = bf.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bf != null) {
bf.close();
」
} catch (IOException e) {
e.printStackTrace();
}
}
return stringBuilder.toString();
}