Java通过JCIFS访问操作Windows(smb)共享目录方法代码

JCIFS是一个开源的Java库,它提供了访问SMB/CIFS共享的功能。通过JCIFS,Java应用程序可以像操作本地文件一样操作远程共享文件夹,实现文件上传、下载、删除、创建等操作。本文主要介绍Java中,使用JCIFS访问windows共享目录或smb协义共享目录,或操作其中文件的方法代码。

1、引入JCIFS的方法

如使用Maven进行构建,可以直接在pom.xml文件中添加依赖。否则,可以CIFS的官方网站下载最新版本的JAR包。

1) 通过Maven引入(pom.xml)

<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.2.19</version>
</dependency>

2) JCIFS官网下载JAR

下载地址https://www.jcifs.org/src/

2、连接共享目录和验证帐户密码

SmbFile对象代表一个远程共享文件或目录。创建SmbFile对象时,需要指定共享路径、用户名和密码。不要将密码硬编码在代码中,可以考虑使用配置文件或环境变量来存储密码。

//import jcifs.smb.NtlmPasswordAuthentication;
//import jcifs.smb.SmbFile;
//import jcifs.smb.SmbFileOutputStream;
//权限, 刚开始没有验证权限报过错误
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://192.168.11.31","UserName", "Password");
            SmbFile file = new SmbFile("smb://192.168.0.1/ShareName/FolderName/", auth);
if (!file.exists()){
System.out.println("exists is true");
}

3、列出显示出共享目录中的SmbFile

使用JCIFS库,在Java程序中连接到一个Windows SMB共享目录,并列出该目录下的所有文件和子目录。如果需要区分文件和目录,可以使用 file.isDirectory() 方法。如果要递归遍历子目录,可以写一个递归函数。别外,确保Java程序具有访问SMB共享的权限。

//import jcifs.smb.NtlmPasswordAuthentication;
//import jcifs.smb.SmbFile;
//import jcifs.smb.SmbFileOutputStream;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://192.168.11.31","UserName", "Password");
            SmbFile smbToFile = new SmbFile("smb://192.168.0.1/ShareName/FolderName/", auth);
            if(smbToFile.isDirectory()){
                for(SmbFile smbfile: smbToFile.listFiles("*")){
                    System.out.println("getName: " +smbToFile.getName());
                }
            }
            else{
                System.out.println("SupplierDrawingList: Directory Name: Not a Directory: ");
            }

4、上传文件到共享目录

使用Java的JCIFS库,将本地文件上传到远程Windows共享目录。需要捕获异常,如IOException、SmbException等,以便处理各种错误情况。对于大文件上传,可以考虑使用更大的缓冲区,或者使用多线程来提高性能。确保用户账号在远程共享目录上具有写入权限。

/**
     * 向共享目录上传文件
     * @param remoteUrl
     * @param localFilePath
     */
    public void uploadFile(String remoteUrl, String localFilePath) {
        try {
            File localFile = new File(localFilePath);
            String fileName = localFile.getName();
            //权限, 刚开始没有验证权限报过错误
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://192.168.11.31","UserName", "Password");
            SmbFile file = new SmbFile(remoteUrl, auth);
            //当成file用
            if (!file.exists()){
                file.mkdirs();
            }
            //下面一行本来打算想新建File在指定目录下并且指定文件名,后面发现第一个参数与File同方法参数意义不同
            SmbFile remoteFile = new SmbFile( file.getURL() + "/" + fileName);
            IOUtils.copy(new FileInputStream(localFile), new SmbFileOutputStream(remoteFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5、下载共享目录文件到本地

使用Java的JCIFS库,将Windows共享目录中的文件下载到本地。使用exists()方法判断远程文件是否存在。使用FileOutputStream创建一个本地文件输出流,用于写入下载的文件内容。使用SmbFileInputStream创建一个SMB文件输入流,用于读取远程文件内容。

 InputStream in = null ;
        ByteArrayOutputStream out = null ;
        try {
            //Create a remote file object
            //String remotePhotoUrl = "smb://share:admin@192.168.135.11/sharedFolder/test.jpg";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://192.168.11.31","UserName", "Password");
            SmbFile remoteFile = new SmbFile(remoteUrl, auth);
            remoteFile.connect(); //尝试连接
            in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
            out = new ByteArrayOutputStream((int)remoteFile.length());
            //读取文件内容
            byte[] buffer = new byte[4096];
            int len = 0; //Read length
            while ((len = in.read(buffer, 0, buffer.length)) != - 1) {
                out.write(buffer, 0, len);
            }
            out.flush(); //方法刷新此输出流并强制将所有缓冲的输出字节被写出
            return out.toByteArray();
        }
        catch (Exception e) {
            String msg = "Download a remote file error: " + e.getLocalizedMessage();
            System.out.println(msg);
        }
        finally {
            try {
                if(out != null) {
                    out.close();
                }
                if(in != null) {
                    in.close();
                }
            }
            catch (Exception e) {}
        }
推荐阅读
cjavapy编程之路首页