目录
- JCIFS 介绍
- SMB协议
- 设置共享文件夹(这里我们选择有密码的方式进行共享)
- 是否设置密码
- 创建 smb 协议
- 测试
- 使用代码将文件夹里的文件下载到本地
项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片、文件等。
那么如何使用 Java 读写 Windows 共享文件夹呢?
Java 可以使用 JCIFS 框架对 Windows 共享文件夹进行读写,就这个框架可以让我们像访问本地文件夹一下访问远程文件夹。
JCIFS的网址: http://jcifs.samba/
JCIFS 介绍
JCIFS 是使用纯 Java 开发的一个开源框架,通过 smb 协议访问远程文件夹。
该框架同时支持 Windows 共享文件夹和 Linux 共享文件夹,不过,Linux 共享文件夹需要安装 Samba 服务软件。
(官网:http://www.samba/)。
SMB协议
SMB 协议(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
SMB 协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。
设置共享文件夹(这里我们选择有密码的方式进行共享)
- 创建一个文件夹;
- 文件夹「右键属性」点击共享;
- 选中的 “everyone” 选项,点击添加;
- 设置级别权限,最后点击最下方的共享;
- 文件夹右键属性,选择高级共享,点击权限,设置权限为完全控制,然后确定;
是否设置密码
根据自己的需求,取选择「有密码保护的共享」或「无密码保护的共享」
打开控制面板进行设置
这里我创建了一个账号用于测试
创建 smb 协议
在正式开始我们的测试之前,我们还需要先给需要共享文件电脑创建 smb 协议,如图:
测试
「按 win + r 键」
测试命令:
\\ip地址\文件夹
例如:\\127.0.0.1\demo
点击确定之后,我们就可以看到,共享文件夹下的文件了。
使用代码将文件夹里的文件下载到本地
<!-- jcifs 共享文件夹目录 -->
<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.3</version>
</dependency>
运行以下代码
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import java.io.*;
public class SmbUtil {
public static void main(String[] args) {
getRemoteFile();
}
public static void getRemoteFile() {
InputStream in = null;
try {
// 创建远程文件对象
// smb://ip地址/共享的路径/...
// smb://用户名:密码@ip地址/共享的路径/...
String remoteUrl = "smb://TestShare:z1019288@192.168.xxx.xxx/share/";
SmbFile remoteFile = new SmbFile(remoteUrl);
remoteFile.connect();//尝试连接
if (remoteFile.exists()) {
// 获取共享文件夹中文件列表
SmbFile[] smbFiles = remoteFile.listFiles();
for (SmbFile smbFile : smbFiles) {
createFile(smbFile);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void createFile(SmbFile remoteFile) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File("D:/file/" + remoteFile.getName());
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[4096];
//读取长度
int len = 0;
while ((len = in.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行成功以后,我们就把共享文件夹中的文件写入到我们指定的文件夹下了。