@[TOC](Java 操作Windows10+ 共享文件 SMBJ库的基本使用(读和写操作))

业务场景

使用它是因为客户要求网盘中能操作共享文件夹,但因为服务器是一台windows server2012+
貌似是不支持smb1协议,故而jcifs并不适用,目前Java实现的开源smb2/smb3库我找到的只有SMBJ

SMBJ

它GitHub是这样说的:SMB2/SMB3 client library for Java
项目github地址:SMBJ
API文档地址:https://www.javadoc.io/doc/com.hierynomus/smbj

简单的使用Demo

仅包含基本使用:读和写

1、创建会话


/*** Windows10 已弃用smb1 需要使用SMBJ** @author luotuan - Luotuan* @version v1.0* @date 2020/11/5* @since v1.0*/
@Configuration
public class RemoteFileForSMBV2 {/*** ip**/private final String hostName = "192.168.43.35";/*** 目标用户名(如需密码则填写上即可此处可以@Value写到配置文件中)**/private final String username = "";/*** 密码**/private final String password = "";@Bean(name = "Smb2Session")public Session getSmb2Session() {//        String hostName = "192.168.1.106";Session s = null;try {SMBClient client = new SMBClient(SmbConfig.createDefaultConfig());Connection c = client.connect(hostName);System.out.println("是否链接:" + c.isConnected());s = c.authenticate(new AuthenticationContext(username, password.toCharArray(), ""));return s;} catch (IOException e) {e.printStackTrace();}return s;}

2、实现简单的读写

接口:

/*** 磁盘共享接口** @author luotuan - Luotuan* @version v1.0* @date 2020/11/5* @since v1.0*/
public interface DiskShareHandleInterface {List<String> listByShareName(String shareName);boolean writeFile(String shareName, String filePath) throws IOException;
}

实现类:

/*** 读写操作** @author luotuan - Luotuan* @version v1.0* @date 2020/11/5* @since v1.0*/
@Component
public class HandleDiskShare implements DiskShareHandleInterface {@Resource(name = "Smb2Session")private Session session;@Overridepublic List<String> listByShareName(String shareName) {ArrayList<String> strings = new ArrayList<>();// 这块官方有示例DiskShare share = (DiskShare) session.connectShare(shareName);List<FileIdBothDirectoryInformation> list = share.list("");for (FileIdBothDirectoryInformation information : list) {strings.add(information.getFileName());}return strings;}@Overridepublic boolean writeFile(String shareName, String filePath) throws IOException {//        filePath = shareName + filePath;DiskShare share = (DiskShare) session.connectShare(shareName);File f = null;int idx = filePath.lastIndexOf("/");String folder = "";String onlyFileName = filePath.substring(idx + 1, filePath.length());if (idx > -1) {folder = filePath.substring(0, idx);}// 文件不存在则创建,存在则打开。try {System.out.println(folder + java.io.File.separator + onlyFileName);f = share.openFile(folder + onlyFileName, new HashSet(Arrays.asList(new AccessMask[]{AccessMask.GENERIC_ALL})),(Set) null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_CREATE,(Set) null);} catch (SMBApiException e) {// 此处取了个巧,捕获了其文件已存在时抛出的异常if (e.getMessage().contains("STATUS_OBJECT_NAME_COLLISION")) {System.out.println("文件已经存在执行打开操作");System.out.println(folder + java.io.File.separator + onlyFileName);f = share.openFile(folder + onlyFileName, new HashSet(Arrays.asList(new AccessMask[]{AccessMask.GENERIC_ALL})),(Set) null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OVERWRITE,(Set) null);}}OutputStream outputStream = null;String str = "Hello World";if (f != null) {outputStream = f.getOutputStream();outputStream.write(str.getBytes());outputStream.flush();outputStream.close();System.out.println("写下了文件");}return true;}
}

在controller中调用

@RestController
@RequestMapping("/api/test/share")
public class HelloController {@Autowiredprivate DiskShareHandleInterface handle;@GetMapping("/list")public List<String> listDis(String shareName) {return handle.listByShareName(shareName);}@PostMapping("/write")public boolean listDis(@RequestBody TestPara testPara) {try {return handle.writeFile(testPara.getShareName(), testPara.getFilePath());} catch (IOException e) {e.printStackTrace();}return false;}}

非常简单的一个demo
记录下,SMB2CreateDisposition里面是些文件操作的枚举。
其操作有如下这些:


import com.hierynomus.protocol.commons.EnumWithValue;/*** [MS-SMB2].pdf 2.2.13 SMB2  CREATE请求 - createDisposition会*定义是否是在名称字段中指定的文件已经存在,服务器必须采取的行动。 对于开放的命名管道,该字段可以被设置                为客户端的任何值,并且必须由服务器忽略。 对于其他文件,该字段必须包含下列值之一。*/
public enum SMB2CreateDisposition implements EnumWithValue<SMB2CreateDisposition> {/*** 如果该文件已经存在,它取代。 否则,创建该文件。 此值不应该被用于打印机对象*/FILE_SUPERSEDE(0x00000000L),/*** 如果该文件已经存在,返回成功; 否则,操作失败。 绝不能用于打印机对象*/FILE_OPEN(0x00000001L),/*** 如果该文件已经存在,操作失败; 否则,创建该文件。*/FILE_CREATE(0x00000002L),/*** 打开该文件,如果它已经存在; 否则,创建该文件。 此值不应该被用于打印机对象*/FILE_OPEN_IF(0x00000003L),/*** 覆盖该文件,如果它已经存在; 否则,操作失败。 绝不能用于打印机对象。*/FILE_OVERWRITE(0x00000004L),/*** 覆盖该文件,如果它已经存在; 否则,创建该文件。 此值不应该被用于打印机对象。*/FILE_OVERWRITE_IF(0x00000005L);private long value;SMB2CreateDisposition(long value) {this.value = value;}public long getValue() {return value;}
}

参考着酌情使用吧。

Java 操作Windows10+ 共享文件 SMBJ库的基本使用相关推荐

  1. Java连接redis选择指定库操作

    redis建立好通常会有15个库,从db0-db15,但是Java操作redis的时候,需要通过jedis连接,默认连接的是db0号库,如果需要往其他号库进行操作,执行以下操作就可以啦. 以maven ...

  2. java 操作 redis_java操作Redis

    10. java操作Redis 10.1 环境准备 1. 引入依赖 redis.clients jedis 2.9.0 2.创建jedis对象 package org.example; import ...

  3. java se翻译_(翻译)Java SE 8 Lambda 标准库概览(下)

    Java SE 8 Lambda 标准库概览 8,Collectors 在目前的例子中,我们已经使用了collect()方法来收集流中的元素并放入List或Set中了.collec()方法的参数是一个 ...

  4. redis入门及java操作

    redis 命令可以去菜鸟教程http://www.runoob.com/redis/redis-tutorial.html 或者以下地址去学习http://www.cnblogs.com/huang ...

  5. java操作ad域 免证书

    为什么80%的码农都做不了架构师?>>>    只提供免证书的认证部分,操作部分可以百度. 认证部分,得到context即可对域进行各种操作: /*** 本文章是针对java JND ...

  6. 基于Java的RDMA高性能通信库(六):SDP - Java Socket Direct Protocol

    目录 1.Java网络编程和套接字API的历史 2.InfiniBand 高速网络通信技术 3. Java 网络协议栈API 4.Java 7 SDP 远程直接内存存取(RDMA) 4.1 Java7 ...

  7. 基于Java的RDMA高性能通信库(一):IBM jVerbs库

    目录 1. verbs API 2. endpoint API 3. jVerbs 应用程序系统和运行时需求(仅限 Linux) 4. Java Socket Over RDMA 与 jVerbs 比 ...

  8. ffmpeg入门及java操作ffmpeg对视频进行处理

    一.ffmpeg 1.简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非 ...

  9. java万法_Java I/O库的设计分析

    Java采用了流的机制来实现输入/输出.所谓流,就是数据的有序排列. 而流可以是从某个源(称为流源或Source of Stream)出来,到某个目的地(称为流汇或Sink of Stream)去的. ...

最新文章

  1. 为什么很多网站的验证码都设置得肉眼都很难识别?
  2. 发现了一个好用的在线勾图的站点
  3. Nova 启动虚拟机流程解析
  4. YY一下,扎克伯格做了一个什么样的AI家居助手?
  5. Android开发之Java和Calendar日期上一年,上一个月,前一天,前一周的方法
  6. php7 setcookie无效_php COOKIE介绍和setcookie有时会在ie下失效问题
  7. 互联网晚报 | 3月15日 星期二 |​ 特斯拉Model 3高性能版和Model Y长续版再涨价;字节成都成立光合科技公司...
  8. 再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她
  9. Android Studio 编译异常Could not execute build using Gradle installation解决办法
  10. 2个月面了鹅厂的5个部门,心态差点奔溃了......
  11. windbg+vm双机调试 waiting to reconnect 无法连接问题,解决办法
  12. 图解TCPIP---第五章---IP协议相关技术
  13. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 一维数据的 K-Means 聚类 ) ★
  14. 计算机电源故障引起火灾,计算机硬件的常见故障及维护方法
  15. x4提示你的产品已经被禁用_win10系统注册表已被管理员禁用的解决方法
  16. 《德鲁克管理思想精要》读书笔记7 - 如何做人
  17. Adobe设计师证书
  18. 如何构建企业内的 TiDB 自运维体系
  19. 2020年9大IT互联网大佬扎心语录
  20. java ffmpeg 合并视频_ffmpeg 合并拼接 mp4视频

热门文章

  1. smart Client开发
  2. 异步社区两周年记-好礼不断
  3. NAT(Network Address Translator,网络地址转换)
  4. 豆瓣最新 zotero translator
  5. DRAM刷新refresh相关知识归类-基础小知识(三)
  6. [答疑]运维记录台账本子识别为一个现状业务实体,妥否
  7. vue开发环境修改本地启动的端口号和开启https
  8. 解决:不能连接到MySQL服务器:“127.0.0.1“
  9. S29GL128P norflash 读写擦除问题
  10. 华中科技大学计算机副院长,华中科技大学计算机应用专业硕士生导师赵峰_计算机考研导师...