• java 客户端使用smb协议传输windows服务器上的文件


    1.业务场景:甲方系统会不定期将一批xls文件存放到windows服务器的共享文件夹下,这些文件将作为本系统的数据来源,需要自动维护到本系统的数据库中。

    2.准备工作:

      ①确保windows服务器的smb服务启动,如果未启动,在启用或关闭windows功能中开启

      ②确保存放的目录已经作为共享文件夹

    3.代码

            <dependency>
                <groupId>jcifs</groupId>
                <artifactId>jcifs</artifactId>
                <version>1.3.17</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
    public static void main(String[] args) throws IOException {
        remoteFile(".docx");
        uploadFile("smb://192.168.1.96/myDownload/","C:\\Users\\USERNAME\\Desktop\\orders.txt");
    }
    
    public static SmbFile getShareedRoot() throws IOException {
        String remoteShareRoot = "smb://192.168.1.96/myDownload/";
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://192.168.1.96/",
                "USERNAME", "PASSWORD");
        SmbFile remoteFile = new SmbFile(remoteShareRoot,auth);
        remoteFile.connect(); //尝试连接
        return remoteFile;
    }
    
    public static SmbFile getSpecified(String remote) throws IOException {
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://192.168.1.96/",
                "USERNAME", "PASSWORD");
        SmbFile remoteFile = new SmbFile(remote,auth);
        remoteFile.connect(); //尝试连接
        return remoteFile;
    }
    
    //查看共享文件列表
    public static SmbFile[] listFiles (SmbFile shareRoot) throws SmbException {
        return shareRoot.listFiles();
    }
    
    public static void downloadFile (SmbFile file) throws IOException {
        String fileName = file.getName();
        String localFile = fileName.substring(fileName.lastIndexOf("\\") + 1);
        try(InputStream in = new BufferedInputStream(new SmbFileInputStream(file)); FileOutputStream out  = new FileOutputStream(new File(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(); //刷新缓冲的输出流
        }
    }
    
    public static void uploadFile (String shareFileRoot, String localFilePath) {
        try {
            File localFile = new File(localFilePath);
            String fileName = localFile.getName();
            SmbFile file = getSpecified(shareFileRoot);
            //当成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();
        }
    }
    
    public static void remoteFile(String want) throws IOException {
        SmbFile shareRoot = getShareedRoot();
        SmbFile smbFile = Arrays.stream(listFiles(shareRoot)).filter(x -> x.getName().endsWith(want)).findAny().get();
        downloadFile(smbFile);
    }

  • 相关阅读:
    人人数据挖掘实习生面经
    关于贝叶斯分类中的二项独立模型和多项式模型
    关于序列的面试题1 判断整数序列是否是二叉排序树的后续遍历
    机器学习经典算法之最小二乘法
    协同过滤算法之—slope one算法
    关于序列的面试题2最大连续子序列和以及积
    控制DOUBLE,DECIMAL小数点的位数
    Invoke的用法
    windowForm学习资料总结
    .NET开发编程规范
  • 原文地址:https://www.cnblogs.com/g177w/p/16049425.html
Copyright © 2020-2023  润新知