摘要 使用Java通过JCIFS框架读写共享文件夹,使用SMB协议,并支持域认证。

项目常常需要有访问共享文件夹的需求,例如读取共享文件夹存储的视频、照片和PPT等文件。那么如何使用Java读写Windows共享文件夹呢?

使用Java访问拥有全部读写权限的共享文件夹比较简单,和普通的目录没有什么区别。但是,如果从Linux服务器访问一个windows服务器上需要用户名和密码验证的共享文件夹,就需要一点点小技巧了。这里介绍一个开源的库JCIFS,他可以轻松满足此需求。

JCIFS是使用Java语言开发的一款开源框架,通过SMB协议访问远程共享文件夹,就像访问本地文件夹一样,简简单单。她同时支持Windows和Linux共享文件夹,不过,Linux共享文件夹需要安装Samba服务软件(官网:http://www.samba.org/)。

另外,通过挂载该共享文件夹到Linux服务器下也可以实现,此时不需要借助SMB协议,对此,这里不做介绍,感兴趣的童鞋可以去问问度娘。

言归正传,maven依赖如下:

org.samba.jcifs

jcifs

1.3.3

SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

代码示例:

importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjcifs.smb.NtlmPasswordAuthentication;importjcifs.smb.SmbFile;importjcifs.smb.SmbFileInputStream;importjcifs.smb.SmbFileOutputStream;public classSmbFileUtil {private static Logger log = LoggerFactory.getLogger(SmbFileUtil.class);private static String USER_DOMAIN = "yourDomain";private static String USER_ACCOUNT = "yourAccount";private static String USER_PWS = "yourPassword";public static void main(String[] args) throwsException {//remoteUrl 格式示例 【smb://132.20.2.33/CIMPublicTest/】//目录

String shareDir = "smb:// 132.20.2.33/CIMPublicTest/";

listFiles(shareDir);

}/*** @Title listFiles

* @Description 遍历指定目录下的文件

* @date 2019-01-11 09:56*/

private static void listFiles(String shareDirectory) throwsException {long startTime =System.currentTimeMillis();//域服务器验证

NtlmPasswordAuthentication auth = newNtlmPasswordAuthentication(USER_DOMAIN, USER_ACCOUNT,

USER_PWS);

SmbFile remoteFile= newSmbFile(shareDirectory, auth);

log.info("远程共享目录访问耗时:【{}】", System.currentTimeMillis() -startTime);if(remoteFile.exists()) {

SmbFile[] files=remoteFile.listFiles();

remoteFile.listFiles(shareDirectory);for(SmbFile f : files) {

log.info(f.getName());

}

}else{

log.info("文件不存在");

}

}

}

NtlmPasswordAuthentication类用于域认证,需要三个参数, 第一个是域名,如果没有,就赋值null, 第二个是用户名,第三个是密码。下面列举SMB协议的两个应用场景。SmbFile类和Java的File类十分相似,使用其对象可以处理远程共享文件的读写。

/*** @Title smbGet

* @Param shareUrl 共享目录中的文件路径,如smb://132.20.2.33/CIMPublicTest/eg.txt

* @Param localDirectory 本地目录,如tempStore/smb*/

public static void smbGet(String shareUrl, String localDirectory) throwsException {

NtlmPasswordAuthentication auth= newNtlmPasswordAuthentication(USER_DOMAIN, USER_ACCOUNT,

USER_PWS);

SmbFile remoteFile= newSmbFile(shareUrl, auth);if (!remoteFile.exists()) {

log.info("共享文件不存在");return;

}//有文件的时候再初始化输入输出流

InputStream in = null;

OutputStream out= null;

log.info("下载共享目录的文件 shareUrl 到 localDirectory");try{

String fileName=remoteFile.getName();

File localFile= new File(localDirectory + File.separator +fileName);

File fileParent=localFile.getParentFile();if (null != fileParent && !fileParent.exists()) {

fileParent.mkdirs();

}

in= new BufferedInputStream(newSmbFileInputStream(remoteFile));

out= new BufferedOutputStream(newFileOutputStream(localFile));byte[] buffer = new byte[1024];while (in.read(buffer) != -1) {

out.write(buffer);

buffer= new byte[1024];

}

out.flush();//刷新缓冲区输出流

}catch(Exception e) {

e.printStackTrace();

}finally{

out.close();

in.close();

}

}/***

* @Title smbPut

* @Description 向共享目录上传文件

* @Param shareDirectory 共享目录

* @Param localFilePath 本地目录中的文件路径

* @date 2019-01-10 20:16*/

public static voidsmbPut(String shareDirectory, String localFilePath) {

InputStream in= null;

OutputStream out= null;try{

File localFile= newFile(localFilePath);

String fileName=localFile.getName();

SmbFile remoteFile= new SmbFile(shareDirectory + "/" +fileName);

in= new BufferedInputStream(newFileInputStream(localFile));

out= new BufferedOutputStream(newSmbFileOutputStream(remoteFile));byte[] buffer = new byte[1024];while (in.read(buffer) != -1) {

out.write(buffer);

buffer= new byte[1024];

}

out.flush();

}catch(Exception e) {

e.printStackTrace();

}finally{try{

out.close();

in.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

java 权限访问共享文件夹_在Java程序中读写windows共享文件夹相关推荐

  1. java权限控制是什么_论Java访问权限控制的重要性

    人在什么面前最容易失去抵抗力? 欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会 ...

  2. outlook 脱机文件夹_在Outlook 2007中使用搜索文件夹节省时间

    outlook 脱机文件夹 This article was written by MysticGeek, a tech blogger at the How-To Geek Blogs. 本文由Ho ...

  3. 天正lisp文件夹_如何在AutoCAD中从Windows资源管理器中打开图形文件夹位置

    涵盖的产品和版本 AutoCAD 2002, AutoCAD 2004, AutoCAD 2005, AutoCAD 2006, AutoCAD 2007, AutoCAD 2008, AutoCAD ...

  4. Java-Day11 面向对象遍程的入门 (类属性的默认值、构造方法、类的成员、static关键字、类的成员加载顺序、Java(权限)访问修饰符)

    目录 1. 类的属性的默认值问题 2. 构造方法(Constructor) 3. 类的成员 3.1 类的成员之一:属性 3.2 UML类图 4. static关键字 5. 类的成员加载(运行)顺序 6 ...

  5. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  6. 微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-翟东平-专题视频课程...

    微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-2445人已学习 课程介绍         微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识. 微信小 ...

  7. 视频教程-微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-微信开发

    微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试 ...

  8. java 设置pdf页面大小_通过Java实现对PDF页面的详细设置

    前言 下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小.页边距.纸张方向.页面旋转等.这里有如下多种页面大小尺寸可供选择: 同时,设置文档内容旋转时,可支持如下角度 ...

  9. 人工智能 java 坦克机器人系列: 强化学习_人工智能 Java 坦克机器人系列: 强化学习...

    人工智能 Java 坦克机器人系列: 强化学习 发表于:2007-05-24来源:作者:点击数: 本文中,我们将使用强化学习来实现一个机器人.使用强化学习能创建一个自适应的战斗机器人.这个机器人能在战 ...

  10. 消除WSL中ls Windows文件夹时背光配色的方法

    消除WSL中ls Windows文件夹时背光配色的方法 产生原因 首先,Linux中ls命令是自带配色的,对于某些文件夹是绿色背景色块,其实是一种权限提示,即777权限.绿色表示不安全,当其他人的权限 ...

最新文章

  1. 深入理解Eureka之源码解析
  2. 敏捷、精益、六西格玛之间到底有什么差异?
  3. [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
  4. OpenCV4 DNN模块 Python APIs
  5. cdoj 1070 秋实大哥打游戏 带权并查集
  6. SAP Cloud for Customer(C4C)和微信集成系列教程
  7. behavior php,behavior.php
  8. git 配置免密登陆
  9. can使能上拉 gpio_IMX6ULL 的 GPIO 操作方法
  10. 关于python_关于python的基础知识
  11. 智能助手被指侵犯用户隐私,美三大科技巨头或面临调查;传小米已解散其VR头显Mi VR团队;特斯拉成立反欺诈部门……...
  12. 计算机应用无法打开,双击磁盘无法打开?_计算机应用_邹志强个人网站—(www.zouzhiqiang.com)...
  13. 内核并发控制---互斥量(来自网易)
  14. 【Flink】FileNotFoundException: JAR file does not exist: -ynm -yst
  15. HTML5移动Web开发指南
  16. 二十五、K8s系统强化1- 系统安全与apparmor
  17. 有了证件照大师 轻松在ps中做证件照
  18. 控制台命令调试(bt)
  19. “华为杯”第十七届中国研究生数学建模竞赛2020 —— B题
  20. vue仿微博评论回复_vue-微博评论

热门文章

  1. 硬件驱动为什么要有WHQL数字签名
  2. Pano2VR制作全景漫游
  3. 跨语言词嵌入模型调研报告
  4. 安卓手机怎么设置蓝牙耳机弹窗动画_AirPods Pro 搭配安卓一个月深度体验
  5. 虚拟机安装OpenGauss企业版
  6. SpringBoot:yml文件详解
  7. sht20中写用户寄存器_哪位帮忙看看下,程序读取SHT20 的温度时就不行,无ACK反馈了...
  8. Geos库学习之(一)——Geos库介绍和编译
  9. 一套基于java的开源车牌识别算法
  10. python语言的多行注释以什么开头和结尾_python多行注释