鸿蒙开发实例|分布式文件服务_将固定于某个地点的某个文件系统,扩展到任意多个地点、多个文件系统,众多的节点组(2)

img
img
img

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

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

需要这份系统化资料的朋友,可以戳这里获取

(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); //获取分布式文件路径

  //读取分布式文件中的数据,若读到则输出,若没读到则输出没读到
     try{
            FileReader fileReader = new FileReader(sharedFileName);
            BufferedReader br = new BufferedReader(fileReader);
            String b = br.readLine();
            text.setText("读取到的上一个写入的时间:"+b);
            text.invalidate();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
            text.setText("没读到");
            text.invalidate();
        }
}

二者都是通过shareFileName()方法获取分布式文件路径的,代码如下:

File distDir = context.getDistributedDir(); //获取分布式文件目录
     //在分布式文件目录下新建一个名为note.txt的文件,读写都在这个文件中进行
     String filePath = distDir+File.separator+"note.txt";
     return filePath; //返回新建文件的路径
}

需要说明的是,利用Context.getDistributedDir()接口可以获取属于自己的分布式目录,然后通过libc或JDK 接口,可以在该目录下创建、删除、读写文件或目录。本例中在所获取的分布式目录下创建了一个读写文件note.txt。

基于两个手机设备进行验证,在开始功能验证之前,两个手机需要登录同一个华为账号,并且需要开启多设备协同权限且开启多设备协同连接。具体的设置过程可参考前面对多设备协同权限设置的介绍。

img
img
img

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

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

需要这份系统化资料的朋友,可以戳这里获取

5%以上大数据知识点,真正体系化!**

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

需要这份系统化资料的朋友,可以戳这里获取

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值