基于SMBJ在局域网内读取共享文件

近期在做公司项目时,有个工作站文件、数据采集的功能需求,文件会被存储在局域网内某台电脑的data/{yyyyMMdd}/...文件夹下,yyyyMMdd代表当天的日期,百度查了下,通常有两种方式可以实现:

(1)FTP的方式,就是把每台设备都安装一下FTP服务搞成一个FTP文件服务器,这种方式操作起来会比较麻烦,而且用户自己不太会操作

(2)采用共享文件夹的方式,这种方式更简单一些

于是决定采用第二种方式,使用的依赖是SMBJ,dependency是

        <!--支持文件共享SMB1协议-->
        <!--<dependency>
            <groupId>org.samba.jcifs</groupId>
            <artifactId>jcifs</artifactId>
            <version>1.3.17</version>
        </dependency>-->
        <!--支持文件共享SMB2/3协议-->
        <dependency>
            <groupId>com.hierynomus</groupId>
            <artifactId>smbj</artifactId>
            <version>0.10.0</version>
        </dependency>

本来考虑使用jcifs,但其支持的是SMB1协议,查阅了其官网发现win10系统已抛弃了SMB1协议而采用SMB2/3协议,并且在该网站推荐使用smbj,因此决定使用smbj来实现访问共文件夹。GitHub地址可参考:https://github.com/hierynomus/smbj

If you're looking for the latest and greatest open source Java SMB library, 
this is not it. JCIFS has been in maintenance-mode-only for several years and although what it does support works fine (SMB1, NTLMv2, midlc, MSRPC and various utility classes), 
jCIFS does not support the newer SMB2/3 variants of the SMB protocol which is slowly becoming required (Windows 10 requires SMB2/3). 
JCIFS only supports SMB1 but Microsoft has deprecated SMB1 in their products. 
So if SMB1 is disabled on your network, JCIFS' file related operations will NOT work.

Fortunately there are multiple new open source SMB Java projects to try including the following:

比较之后决定使用smbj来实现,在此之前需要做一些准备工作。

(1)把文件夹设置为共享文件夹,并且最好设置为密码访问的方式,否则局域网内所有电脑都能访问该文件夹。

 指定为共享文件夹,选择共享给哪个用户,默认是需要账号密码的,如果你的电脑用户都是无密码的,那么你可以选择让该文件夹设置为不共享,如果你希望是需要密码的那么你最好自己新建个用户。

(2) 如果选择有密码的共享,本地用户本来就有密码那在代码里使用该用户密码访问就可以,如果没有的话可以新建一个带密码的用户。

(2)

如下是编写的访问共享文件的代码部分。

                String equiptIp  = "10.x.x.x";
                String authUserName = "xxx";
                String authPwd = "xxx";
                String shareDir = "share";
                Connection connection = null;
                Session session = null;
                DiskShare dirShare = null;
                try {
                    connection = client.connect(equiptIp);
                } catch (IOException e1) {
                    LOGGER.info(equiptIp + "连接失败!");
                    e1.printStackTrace();
                    return ;
                }
                    LOGGER.info(equiptIp + "连接成功:" + connection.isConnected());
                    AuthenticationContext ac = new AuthenticationContext(authUserName, authPwd.toCharArray(), null); //null位置是输入域名的,没有可为空

                try {
                    session = connection.authenticate(ac);
                } catch (Exception e) {
                    LOGGER.info(equiptIp + "认证失败失败!");
                    e.printStackTrace();
                    continue;
                }
                LOGGER.info(equiptIp + "认证成功!");
                try {
                    dirShare = (DiskShare) session.connectShare(shareDir);
                } catch (Exception e) {
                    LOGGER.info(equiptIp + "读取共享文件夹" + shareDir +"失败!");
                    e.printStackTrace();
                    continue;
                }
                
                String fileDir = "20210906"+ "/dir1";
                if (dirShare.folderExists(fileDir)) {
                    Directory directory = dirShare.openDirectory(fileDir, EnumSet.of(AccessMask.FILE_LIST_DIRECTORY), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);
                    List<FileIdBothDirectoryInformation> list = directory.list();
                    for (FileIdBothDirectoryInformation f : list) {
                        String fileName = f.getFileName(); // 文件名字
                        String fileUrl = fileDir + "/" + fileName;

                        if (!".".equals(fileName) && !"..".equals(fileName) && dirShare.fileExists(fileUrl)) {
                            // 这里就可以拿到文件流了,可以读取
                           File smbFileRead = dirShare.openFile(fileUrl, EnumSet.of(AccessMask.GENERIC_READ), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);
                            InputStream in = smbFileRead.getInputStream();
// ......
                        }

                    }
                }
                try {
                    if (dirShare != null) {
                        dirShare.close();
                    }
                    if (session != null) {
                        session.close();
                    }
                    if (connection != null) {
                        connection.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

在拿到inputStream后就可以读取文件到应用服务器了,之后的操作可以按照我们的业务来编写代码。

由于采用的定时任务,为防止重复读取文件,我的业务代码里使用(fileName + 系统业务的一个相关ID + 当天日期yyyyMMdd)做MD5加密得到一个字符串作为这个文件存储数据表的ID,每次访问共享文件的时候会作比较。是否已读取过。

需求中还包括CSV数据采集和Access数据采集,后续更新。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ipublicationerrorhandler smbj 是一个Java编程语言中的接口,它可以用于处理iPublication的错误。iPublication是一种数字出版物的格式,通常用于电子书等数字出版物的制作和发布。使用ipublicationerrorhandler smbj接口可以方便地处理iPublication文件在制作和发布过程中可能出现的各种错误情况,比如文件格式不符合规范、文件损坏或意外中断等。通过实现该接口并将其与其他Java程序结合使用,可以有效地提高数字出版物制作和发布的质量和效率。该接口具有诸多的方法,包括错误记录、错误匹配和处理等,因此可以根据具体情况进行灵活的使用和调整。总之,ipublicationerrorhandler smbj是一个非常有用的Java编程接口,它可以帮助开发人员更加高效地处理数字出版物制作和发布中的错误问题,提高数字出版物的质量和效率,从而更好地服务于广大用户的阅读需求。 ### 回答2: iPublicationErrorHandler SMBJ指的是一个错误处理程序,用于处理在SMBJ Java库中使用的IPublication接口中的错误。 在Java编程中,SMBJ是一个用于管理SMB(Server Message Block)协议的库。SMB是一种协议,用于在本地网络上共享文件和打印机。 Samba是一个实现SMB协议的开源软件。而SMBJ则是一个基于Samba的Java库,允许Java程序可以通过SMB协议访问共享文件和打印机。 在SMBJ中,IPublication接口用于表示SMB服务器上的共享文件。iPublicationErrorHandler SMBJ是一个针对IPublication接口的错误处理程序。它主要用于捕捉在访问SMB服务器上的共享文件时可能出现的异常情况,例如连接超时、认证错误、权限不足等等,并提供相应的错误提示和处理方式。 通过使用iPublicationErrorHandler SMBJ,Java程序员可以更加方便地对SMB服务器上的共享文件进行管理和访问,提高了程序的可靠性和稳定性。 ### 回答3: ipublicationerrorhandler smbj是一个技术术语,它在javasmbj库中使用。 smbj是一个由Huddle公司开发的smb客户端库,用于在Java应用程序中访问SMB共享文件和打印机。ipublicationerrorhandler smbj是smbj库中的接口,它是用于处理发生错误时的回调函数接口。 当smbj尝试访问SMB共享文件和打印机时,可能会出现各种类型的错误。在这种情况下,应用程序可以通过实现ipublicationerrorhandler smbj接口来处理这些错误,并根据情况采取适当的行动。 例如,当发生文件读取错误时,应用程序可以实现ipublicationerrorhandler smbj接口来捕获此错误,并通知用户出现了问题。此外,ipublicationerrorhandler smbj接口还可以实现日志记录和其他错误处理任务,以帮助增强应用程序的健壮性和稳定性。 总之,ipublicationerrorhandler smbj是smbj库中的一个非常重要的接口,它可以帮助应用程序有效地处理各种类型的错误,并保持应用程序的最佳性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值