目录
摘要
使用Java通过JCIFS框架读写共享文件夹,使用SMB协议,并支持域认证。
项目常常需要有访问共享文件夹的需求,例如读取共享文件夹存储的视频、照片和PPT等文件。那么如何使用Java读写Windows共享文件夹呢?
使用Java访问拥有全部读写权限的共享文件夹比较简单,和普通的目录没有什么区别。但是,如果从Linux服务器访问一个windows服务器上需要用户名和密码验证的共享文件夹,就需要一点点小技巧了。这里介绍一个开源的库JCIFS,他可以轻松满足此需求。
JCIFS是使用Java语言开发的一款开源框架,通过SMB协议访问远程共享文件夹,就像访问本地文件夹一样,简简单单。她同时支持Windows和Linux共享文件夹,不过,Linux共享文件夹需要安装Samba服务软件(官网:http://www.samba.org/)。
另外,通过挂载该共享文件夹到Linux服务器下也可以实现,此时不需要借助SMB协议,对此,这里不做介绍。
设置共享文件夹
设置共享文件夹(这里我们选择有密码的方式进行共享)
创建一个文件夹;
文件夹「右键属性」点击共享;
选中的 “everyone” 选项,点击添加;
设置级别权限,最后点击最下方的共享;
文件夹右键属性,选择高级共享,点击权限,设置权限为完全控制,然后确定;
共享文件电脑创建 smb 协议
是否设置密码
根据自己的需求,取选择「有密码保护的共享」或「无密码保护的共享」
打开win11 网络和Internet进行设置
添加一个测试用户
win11添加其他用户跳过邮箱登录
测试
「按 win + r 键」
测试命令:
\\10.106.138.27\test
代码示例
<!-- jcifs 共享文件夹目录 -->
<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.3</version>
</dependency>
package io.github.rovingsea.glancecorrection.sample.utils;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import java.io.*;
import java.nio.file.Files;
import java.util.Objects;
public class SmbFileUtils {
public static void main(String[] args) {
getRemoteFile();
}
public static void getRemoteFile() {
// 创建远程文件对象
// smb://ip地址/共享的路径/...
// smb://用户名:密码@ip地址/共享的路径/...
String remoteUrl = "smb://test1:test1@10.106.xxx.27/test/";
smbTransferFile(remoteUrl, "D:\\exp_2023_05_25_14_11_13.log");
SmbFile[] smbFiles = smbGetFiles(remoteUrl);
if (Objects.nonNull(smbFiles)) {
for (SmbFile smbFile : smbFiles) {
System.out.println("smbFile路径:" + smbFile.getUncPath());
}
}
}
/**
* @return
* @Description 从共享目录读取文件
* @Param shareDirectory 共享目录
*/
private static SmbFile[] smbGetFiles(String remoteUrl) {
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
remoteFile.connect();//尝试连接
if (remoteFile.exists()) {
// 获取共享文件夹中文件列表
return remoteFile.listFiles();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
/**
* @Description 向共享目录上传文件
* @Param shareDirectory 共享目录
* @Param localFilePath 本地目录中的文件路径
*/
public static void smbTransferFile(String shareDirectory, String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(shareDirectory + fileName);
in = new BufferedInputStream(Files.newInputStream(localFile.toPath()));
out = new BufferedOutputStream(new SmbFileOutputStream(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 {
if (Objects.nonNull(out)) {
out.close();
}
if (Objects.nonNull(in)) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行成功以后,我们就把共享文件夹中的文件写入到我们指定的共享文件夹了