rawfile的使用 原创 精华
直接上总结
-
路径是否应该加前缀,即
"entry/resources/rawfile/test.txt"
还是"resources/rawfile/test.txt"
?-
这两种写法效果一样。
"resources/..."
是"entry/resources/..."
的简写形式。 -
加上module名称(如entry、myfeature)特指相应module包中的目录。如:
"myfeature/resources/rawfile/test.txt"
-
特别说明:就算在myfeature这个module里
"resources/..."
也是"entry/resources/..."
的简写形式。 -
特别说明:如果entry的名称不是默认的,比如,定义为app。那么相应的
"resources/..."
是"app/resources/..."
的简写形式。
-
-
同名文件是否会覆盖?
文件覆盖的情况只发生在覆盖HarmonyOs Library中的文件。因为library可以打包进entry或feature中,会被同名文件覆盖。而feature是独立的包,不会被entry中的同名文件覆盖。
结论:entry或feature中的同名文件会覆盖library中的相应文件。
-
其它
-
"/entry/resources/rawfile/test.txt"
(路径前面有/
)的写法是错误的! -
"myfeature/..."
和"myFeature/..."
是不同的!路径大小写敏感。 -
rawfile是只读的!(这不很明显吗?它只存在于hap包里,不可写。但是真的有人会问“怎么写文件到rawfile目录下”)
-
class Resource extends InputStream
,所以对rawfile的文件操作基本和InputStream完全一样。如下:RawFileEntry rawFileEntry = context.getResourceManager().getRawFileEntry(rawFilePath); //这里只是演示读取文本文件 private static String readRawFile(RawFileEntry rawFileEntry) { try (Resource resource = rawFileEntry.openRawFile(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource))) { String line; StringBuilder sb = new StringBuilder(); while ((line = bufferedReader.readLine()) != null) { sb.append(line); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; }
-
验证过程
代码见文末,建议自己跑一下。
插入视频真困难。动图又限制大小。跳到b站看吧。
----> 演示视频 <----
打印目录结构的日志:(自己比较一下注释的其它的几个路径)
// String dirPath = "entry";
String dirPath = "resources";//等价于"entry"或"entry/resources"
// String dirPath = "myfeature";
// String dirPath = "myfeature/resources";
// String dirPath = "myfeature/resources/rawfile";
String ret = RawFileTool.read(getContext(), dirPath);
System.out.println(ret);
showText(ret);
思考
我们先解包hap包,基本就能知道rawfile和安卓的assets file是类似的。也许还相互兼容呢。有兴趣的朋友可以验证一下。也欢迎分享你的成果。
-
1.3. “就算在myfeature这个module里
"resources/..."
也是"entry/resources/..."
的简写形式”。为什么是这样的结论?个人认为,有可能是以下三个原因吧:一、代码上就是这样约定的。二、这样比较符合常理。三、运行时可能不方便知道当前处于哪个module中。
-
rawfile的文件结构和安卓的assets file对比,有什么改进?
在安卓上做过 “组件化” 开发的兄弟们,应该很容易想到这个问题。我们知道安卓上的组件化框架,最终把各个组件打成一个apk的时候,都会有资源合并这一步。assets file同名的会覆盖,这不符合常理啊。但是安卓在设计之除考虑不到这种问题。
可喜可贺的是,鸿蒙从一开始,原生就是组件化的结构。没有安卓组件化开发中的那些问题。因为它的resources目录结构就决定了不会有资源冲突的问题。每个组件的资源文件都在各自的目录下。
正好晚上回去试试,感谢楼主分享。