rawfile的使用 原创 精华

没用的喵叔
发布于 2021-7-5 19:55
浏览
3收藏

直接上总结

  1. 路径是否应该加前缀,即"entry/resources/rawfile/test.txt"还是"resources/rawfile/test.txt"

    1. 这两种写法效果一样。"resources/...""entry/resources/..."的简写形式。

    2. 加上module名称(如entry、myfeature)特指相应module包中的目录。如:"myfeature/resources/rawfile/test.txt"

    3. 特别说明:就算在myfeature这个module里"resources/..."也是"entry/resources/..."的简写形式。

    4. 特别说明:如果entry的名称不是默认的,比如,定义为app。那么相应的"resources/...""app/resources/..."的简写形式。

  2. 同名文件是否会覆盖?

    文件覆盖的情况只发生在覆盖HarmonyOs Library中的文件。因为library可以打包进entry或feature中,会被同名文件覆盖。而feature是独立的包,不会被entry中的同名文件覆盖。


    结论:entry或feature中的同名文件会覆盖library中的相应文件。

  3. 其它

    1. "/entry/resources/rawfile/test.txt"(路径前面有/)的写法是错误的!

    2. "myfeature/...""myFeature/..."是不同的!路径大小写敏感。

    3. rawfile是只读的!(这不很明显吗?它只存在于hap包里,不可写。但是真的有人会问“怎么写文件到rawfile目录下”)

    4. 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);

rawfile的使用-鸿蒙开发者社区

思考

我们先解包hap包,基本就能知道rawfile和安卓的assets file是类似的。也许还相互兼容呢。有兴趣的朋友可以验证一下。也欢迎分享你的成果。

rawfile的使用-鸿蒙开发者社区

  1. 1.3. “就算在myfeature这个module里"resources/..."也是"entry/resources/..."的简写形式”。为什么是这样的结论?

    个人认为,有可能是以下三个原因吧:一、代码上就是这样约定的。二、这样比较符合常理。三、运行时可能不方便知道当前处于哪个module中。

  2. rawfile的文件结构和安卓的assets file对比,有什么改进?

    在安卓上做过 “组件化” 开发的兄弟们,应该很容易想到这个问题。我们知道安卓上的组件化框架,最终把各个组件打成一个apk的时候,都会有资源合并这一步。assets file同名的会覆盖,这不符合常理啊。但是安卓在设计之除考虑不到这种问题。

    可喜可贺的是,鸿蒙从一开始,原生就是组件化的结构。没有安卓组件化开发中的那些问题。因为它的resources目录结构就决定了不会有资源冲突的问题。每个组件的资源文件都在各自的目录下。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
TestRaw.zip 102.27K 61次下载
已于2021-7-5 20:43:32修改
3
收藏 3
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

正好晚上回去试试,感谢楼主分享。

已于2021-7-5 20:03:09修改
回复
2021-7-5 20:02:41
回复
    相关推荐