02、分布式文件

分布式文件是指依赖于分布式文件系统并分散存储在多个用户设备上的文件,应用间的分布式文件目录互相隔离,不同应用的文件不能互相访问。

03、文件元数据

文件元数据是用于描述文件特征的数据,包含文件名、文件大小、创建、访问、修改时间等信息。

在HarmonyOS中,分布式文件服务支持用户设备中的应用程序在同一账号下多设备之间进行文件共享。即应用程序可以屏蔽文件具体的存储位置,在多个设备之间无障碍访问文件。HarmonyOS中分布式文件服务的运作机制如图1所示。

■ 图1 Harmony OS中分布式文件服务的运作机制

从图1可以看出,在HarmonyOS中,分布式文件服务采用无中心节点的设计,每个设备都存储一份全量的文件元数据和本设备上产生的分布式文件,元数据在多台设备间互相同步,当应用需要访问分布式文件时,分布式文件服务首先查询本设备上的文件元数据,获取文件所在的存储设备,然后对存储设备上的分布式文件服务发起文件访问请求,将文件内容读取到本地。

实际上,在HarmonyOS中实现分布式文件服务前,需要满足以下条件:

(1) 应用程序如需使用分布式文件服务完整功能,需要申请分布式数据管理权限,具体地,申请ohos.permission.DISTRIBUTED_DATASYNC权限,从而允许不同设备间的数据交换。

(2) 要实现分布式共享文件,则多个设备需登录同一个华为账号,打开蓝牙设备,连接同一个WLAN 局域网。

(3) 存在多设备并写的场景,为了避免冲突,开发者需要对文件加锁保护,保证文件独享。非持锁情况下,并发写冲突时,后一次会覆盖前一次。

(4) 应用访问分布式文件时,文件所在设备不能离线,否则文件不能访问。

(5) 当网络情况较差时,访问存储在远端的分布式文件可能会长时间得不到响应甚至响应失败,因此需要应用考虑到对这种场景的处理。

(6) 当两台设备有同名文件时,如果元数据进行同步则会产生冲突,分布式文件服务会根据时间戳将文件按创建的先后顺序重命名,因此,为避免此类场景出现,应用在文件名上可以进行相应设备区分,例如,deviceID+时间戳。

下面通过一个实例学习如何在HarmonyOS中具体实现多设备间的文件共享。实例实现了在两个手机设备上进行分布式时间读写的功能,即在手机A 上单击写入Button,将当前时间写入分布式文档。在手机B上单击读取Button,可以从分布式文档中获取手机A 中写入的时间,反之亦然。需要注意的是,两个手机设备需要登录同一个华为账号,故需要开启多设备协同权限。

首先,创建Phone设备下的Java模板新项目,打开项目目录下的MainAbilitySclice.java文件,在onStart()方法中声明布局,代码如下:

DirectionalLayout directionLayout= new DirectionalLayout(this);
directionLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
directionLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
directionLayout.setOrientation(Component.VERTICAL);
directionLayout.setPadding(32, 32, 32, 32);

在布局中添加Text组件用以显示提示信息及读取到的时间,代码如下:

Text text= new Text(this);
text.setText("初始文本"); //设置初始显示文本
text.setTextSize(50);
DirectionalLayout.LayoutConfig layoutConfig = newDirectionalLayout.LayoutConfig (ComponentContainer.LayoutConfig.MATCH_CONTENT,ComponentContainer.LayoutConfig.MATCH_CONTENT);
layoutConfig.alignment = LayoutAlignment.HORIZONTAL_CENTER;
text.setLayoutConfig(layoutConfig);
directionLayout.addComponent(text);

在本例中两个设备通过各自的Button组件实现时间的读写,因此,需要添加两个Button组件,首先添加写入时间的Button组件,代码如下:

//实现写入功能的Button,用来读取当前时间,并写入分布式文档中
Button button1 = new Button(this);
layoutConfig.setMargins(0, 50,0,0);
button1.setLayoutConfig(layoutConfig);
button1.setText("写入现在时间");
button1.setTextSize(50);
ShapeElement background1 = new ShapeElement();
background1.setRgbColor(new RgbColor(0xFF51A8DD));
background1.setCornerRadius(25);
button1.setBackground(background1);
button1.setPadding(10, 10, 10, 10);
button1.setClickedListener(new Component.ClickedListener() {
      @Override
      public void onClick(Component Component) {
           goWrite(text); //单击Button,实现写入功能
      }
});
directionLayout.addComponent(button1);

添加读取时间的Button组件,代码如下:

//实现读取功能的Button,从分布式文档中读取已经写入的时间
Button button2 = new Button(this);
layoutConfig.setMargins(0, 50,0,0);
button2.setLayoutConfig(layoutConfig);
button2.setText("读取上一个时间");
button2.setTextSize(50);
ShapeElement background2 = new ShapeElement();
background2.setRgbColor(new RgbColor(0xFF5100DD));
background2.setCornerRadius(25);
button2.setBackground(background1);
button2.setPadding(10, 10, 10, 10);
button2.setClickedListener(new Component.ClickedListener() {
      @Override
//单击Button,实现读取功能
      public void onClick(Component Component) {
           goRead(text);
      }
});
directionLayout.addComponent(button2);

写入功能是由goWrite()方法实现的,分析其实现过程,代码如下:

//goWrite():写入button1的onClick事件执行的方法
private void goWrite(Text text) {
     String sharedFileName = sharedFileName(this); //获取分布式文件路径
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     String str=simpleDateFormat.format(new Date().getTime()); //获取时间戳并转换成标准形式

//将时间写入分布式文件
     try{
          FileWriter fileWriter = new FileWriter(sharedFileName,false);
          fileWriter.write(str);
          fileWriter.close();
     } catch (IOException e) {
            e.printStackTrace();
     }
     text.setText("写入的时间:"+str); text.invalidate();
}

读取功能是由goRead()方法实现的,其实现过程代码如下:

//goRead():读取button2的onClick事件执行的方法
private void goRead(Text text) {
     String sharedFileName = sharedFileName(this); //获取分布式文件路径



![img](https://img-blog.csdnimg.cn/img_convert/d47becd043fc98962c955f5f221b182a.png)
![img](https://img-blog.csdnimg.cn/img_convert/b7a7489ffdcab7b7c03c14a008c5056d.png)
![img](https://img-blog.csdnimg.cn/img_convert/8bee0d57960341045808ff8aae9d0b1c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐