超详细:Java 读取 Windows 共享文件夹中的文件,并下载到本地电脑中


项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片、文件等。

那么如何使用 Java 读写 Windows 共享文件夹呢?

Java 可以使用 JCIFS 框架对 Windows 共享文件夹进行读写,就这个框架可以让我们像访问本地文件夹一下访问远程文件夹。

JCIFS的网址: http://jcifs.samba.org/

JCIFS 介绍

JCIFS 是使用纯 Java 开发的一个开源框架,通过 smb 协议访问远程文件夹。

该框架同时支持 Windows 共享文件夹和 Linux 共享文件夹,不过,Linux 共享文件夹需要安装 Samba 服务软件。

(官网:http://www.samba.org/)。

SMB协议

SMB 协议(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

SMB 协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。

设置共享文件夹(这里我们选择有密码的方式进行共享)

  1. 创建一个文件夹;
  2. 文件夹「右键属性」点击共享;
  3. 选中的 “everyone” 选项,点击添加;
  4. 设置级别权限,最后点击最下方的共享;
  5. 文件夹右键属性,选择高级共享,点击权限,设置权限为完全控制,然后确定;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

是否设置密码

根据自己的需求,取选择「有密码保护的共享」或「无密码保护的共享」

打开控制面板进行设置
在这里插入图片描述
这里我创建了一个账号用于测试

在这里插入图片描述
在这里插入图片描述

创建 smb 协议

在正式开始我们的测试之前,我们还需要先给需要共享文件电脑创建 smb 协议,如图:

1.1 控制面板->程序->启用或关闭window功能->smb1.0

测试

「按 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();
            }
        }
    }
}

运行成功以后,我们就把共享文件夹中的文件写入到我们指定的文件夹下了。

在这里插入图片描述

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuZhan7710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值