用JCIFS下载windows共享文件
文章目录
- 引用JCIFS
- 访问共享
- 获取文件
- 写入文件
- Demo
- 扩展阅读
有同事在外地,他们提供给我的软件包也是在他们本地的,因此开启了windows自带的共享,这样就方便我们取包。由于地域限制,我们访问非常的慢,因此考虑到用Jenkins来触发,下载软件包到我们本地服务器。
先分析下这个需要怎么处理。因为windows共享属于SMB协议,不同的windows系统SMB协议版本不同,目前常见的win7最高支持SMB2,因此对于SMB协议,可以用「JCIFS」库来操作。
- 技术栈:Java
- 知识:JCIFS、SMB
引用JCIFS
创建一个maven工程,然后在pom.xml中添加依赖包。最新的是1.3.18。
<dependency><groupId>jcifs</groupId><artifactId>jcifs</artifactId><version>1.3.18</version>
</dependency>
访问共享
访问共享有几种方式,用匿名访问,用户名访问,带域名访问共享,这几种用的不同的方法。我把我自己遇到的坑提出来,希望能帮助到其他人。
- 匿名访问,需要的访问路径加上一个常量ANONYMOUS
import jcifs.smb.SmbFile;
String remoteUrl= "smb//1.1.1.1/smb/package.zip";
smbFile = new SmbFile(remoteUrl, NtlmPasswordAuthentication.ANONYMOUS);
- 用户名访问,直接在路径里面体现用户名和密码,以及域名
import jcifs.smb.SmbFile;
String remoteUrl= "smb//domain;user:passwd@1.1.1.1/smb/package.zip";
SmbFile smbFile = new SmbFile(remoteUrl);
2.1 JCIFS访问共享的时候密码用户名包含了百分号或者特殊符号
这里有一个坑,就是用户名和密码包含了%以及其他的特殊字符,会导致验证失败。所以下面这个问题就可以解决。
3. 先用NtlmPasswordAuthentication,后Get
import jcifs.smb.SmbFile;
import jcifs.smb.NtlmPasswordAuthentication;String remoteUrl= "smb//1.1.1.1/smb/package.zip";
NtlmPasswordAuthentication ntPassAuth = newNtlmPasswordAuthentication(domain, user, passwd);
SmbFile smbFile = new SmbFile(remoteUrl, ntPassAuth);
还有一些其他的用法,这里没有用到,可以参考官方API。
获取文件
获取文件用这个SmbFileInputStream,一句话就搞定;
import jcifs.smb.SmbFileInputStream;
in = new BufferedInputStream(new SmbFileInputStream(smbFile));
写入文件
写到本地一样和输入一样的,一句话就可以搞定。
import jcifs.smb.SmbFileInputStream;
out = new BufferedOutputStream(new FileOutputStream(localFile));
Demo
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
import jcifs.smb.NtlmPasswordAuthentication;InputStream in = null;
OutputStream out = null;
long a = new Date().getTime();
try {// authenticationNtlmPasswordAuthentication ntPassAuth = newNtlmPasswordAuthentication("ad.xxx.com", "testuser", "pass%word");// access cifs shareSmbFile smbFile = new SmbFile(remoteUrl, ntPassAuth);String fileName = smbFile.getName();int length = smbFile.getContentLength();// create file as same nameFile localFile = new File(localDir + File.separator + fileName);in = new BufferedInputStream(new SmbFileInputStream(smbFile));out = new BufferedOutputStream(new FileOutputStream(localFile));byte[] buffer = new byte[1024 * 1024]; // a buff 1Mint sum = 0;while ((in.read(buffer)) != -1) {out.write(buffer);sum += buffer.length;System.out.println("Complete: "+sum *100.0/length+"%");buffer = new byte[1024];}
} catch (Exception e) {e.printStackTrace();
} finally {try {out.close();in.close();long b = new Date().getTime();int c = (int)((b- a) / 1000);System.out.println("used time: "+ c +"s");} catch (IOException e) {e.printStackTrace();}
}
扩展阅读
- The Java CIFS Client Library
用JCIFS下载windows共享文件相关推荐
- 超详细:Java 读取 Windows 共享文件夹中的文件,并下载到本地电脑中
目录 JCIFS 介绍 SMB协议 设置共享文件夹(这里我们选择有密码的方式进行共享) 是否设置密码 创建 smb 协议 测试 使用代码将文件夹里的文件下载到本地 项目常常需要有访问共享文件夹的需求, ...
- windows的盘共享挂载到linux下,通过Windows共享文件夹直接挂载到Linux中使用(实验操作)...
通过Windows共享文件夹直接挂载到Linux中使用 实验背景:如果在Windows上有下载的压缩包,我们可以直接通过Windows的共享直接挂载到Linux中直接使用 实验环境:Windows系统 ...
- android 程序 共享文件,如何从Android智能手机访问Windows共享文件夹 | MOS86
为了从Android设备访问Windows PC上的共享文件,您可以使用名为ES File Explorer File Manager的第三方应用程序.在此之前,您必须检查您是否有足够的权限访问数据. ...
- 一步一学Linux与Windows 共享文件Samba (v0.2b)---转自linuxsir
作者:北南南北,正在增加中... ... 需要您的参与: 来自:LinuxSir.Org 简介:本文只是讲一讲我们最常用的Linux与Windows共享文件,主要是为新手指一指路.如何建立最简单的Sa ...
- linux 内网共享文件夹_在Linux下访问Windows共享文件夹
说明 以下操作以Ubuntu为例,大家可以参考. 我在Ubuntu 14.04和16.04都试过了. Windows共享文件夹 如果局域网内有一台Windows主机,将指定文件夹设为共享,就可以在局域 ...
- 使用JCIFS获取远程共享文件
package com.jadyer.util; import java.io.File; import java.io.FileOutputStream; import java.io.I ...
- CentOS6.5挂载windows共享文件夹
由于工作需要,需要把本机的文件夹共享出去,然后让CentOS服务器临时使用下. 服务器使用的是CentOS系统,而本机使用的win7系统.考虑到是临时使用,所以就不打算搭建FTP和Samba服务器,直 ...
- 虚拟机Oracle VM VirtualBox linux系统如何访问windows共享文件夹
1. 在本机系统设置一个共享文件夹,用于与Ubuntu交互的区域空间. 2.右击状态栏上共享文件夹图标或菜单栏"设备-共享文件夹",打开共享文件夹设置,如图示 3.点击共享 ...
- mount挂载windows共享文件夹
今天在centos 7下挂载windows共享文件夹遇到报错 mount error(115): Operation now in progress Refer to the mount.cifs(8 ...
最新文章
- php 跨进程读写,php使用多个进程同时控制文件读写示例
- 分享一款超棒的jQuery旋钮插件 - jQuery knob
- EasyUI的datebox用法
- CentOS6下ssh简介及openssh的应用
- Centos下的apache2练习
- 基于openstack搭建百万级并发负载均衡器的解决方案
- 关于异地高考引发的又一次舆论攻势
- js中字符串操作函数
- android之XmlSerializer序列化XML(写入) android之XmlSerializer序列化XML(写入)...
- dnsmasq安装配置
- 类的继承关系声明和访问修饰
- 傅里叶光学MATLAB编程系列【1】基本函数
- Android签名证书生成
- oracle客户端 PLSQL安装配置教程
- 计算机技术在图形图像处理中的应用,计算机图形图像处理技术综述
- android手机 hdmi,手机的高清输出——MHL和micro HDMI测试
- 手刃豆瓣top250排行榜
- C语言中side的用法,side的用法总结大全
- 心无界,牧云端:华为云与人工智能的野望
- 奇安信(2019笔试题)