1、JCIFS介绍

JCIFS是使用纯Java开发的一个开源框架,通过smb协议访问远程文件夹。该框架同时支持Windows共享文件夹和Linux共享文件夹,不过,Linux共享文件夹需要安装Samba服务软件(官网:http://www.samba.org/)。

2、SMB协议

SMB协议(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。

3、设置共享文件夹

  • 创建一个文件夹
  • 文件夹右键属性点击共享
  • 选中的 “everyone” 选项,点击添加;设置级别权限,最后点击最下方的共享
  • 文件夹右键属性,选择高级共享,点击权限,设置权限为完全控制,然后确定
  • 打开网络和共享中心,点击更改高级共享设置,开启“启用文件和打印机共享”和“关闭密码保护共享”,点击“保持修改”
  • 在另一台电脑输入共享文件夹电脑的ip地址。如:\192.168.1.6
    在这里插入图片描述
    在这里插入图片描述

4、java读取共享文件夹中的文件

4.1、添加smb协议依赖
<!--smb协议获取共享文件夹内容-->
<dependency>
    <groupId>jcifs</groupId>
    <artifactId>jcifs</artifactId>
    <version>1.3.17</version>
</dependency>
4.2、创建连接,并将文件复制到本地桌面中的file文件夹
public void getRemoteFile(){
    InputStream in = null;
    try {
        // 创建远程文件对象
        // smb://用户名:密码/共享的路径/...
        // smb://ip地址/共享的路径/...
        String remoteUrl = "smb://192.168.xx.xx/file/";
        SmbFile remoteFile = new SmbFile(remoteUrl);
        remoteFile.connect();//尝试连接
        if(remoteFile.exists()){
            // 获取共享文件夹中文件列表
            SmbFile[] smbFiles = remoteFile.listFiles();
            for (SmbFile smbFile : smbFiles) {
                createFile(smbFile);
            }
        }else {
            log.error("文件不存在!");
        }
    }catch (Exception e) {
        log.error("访问远程文件夹出错:" + e.getLocalizedMessage());
    }finally {
        try {
            if(in != null) in.close();
        }catch (Exception e) {
            log.error("关闭资源错误");
        }
    }
}

public void createFile(SmbFile remoteFile){
    InputStream in = null;
    OutputStream out = null;
    try {
        File localFile = new File("C:/Users/admin/Desktop/file/"+remoteFile.getName());
        in = new BufferedInputStream(new FileInputStream(localFile));
        out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
        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) {
        log.error("读取文件发生错误!");
    } finally {
        try {
            if(out != null) {
                out.close();
            }
            if(in != null) {
                in.close();
            }
        }
        catch (Exception e) {
            log.error("关闭资源发生错误!");
        }
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐