文章目录

  • 引用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>

访问共享

访问共享有几种方式,用匿名访问,用户名访问,带域名访问共享,这几种用的不同的方法。我把我自己遇到的坑提出来,希望能帮助到其他人。

  1. 匿名访问,需要的访问路径加上一个常量ANONYMOUS
import jcifs.smb.SmbFile;
String remoteUrl= "smb//1.1.1.1/smb/package.zip";
smbFile = new SmbFile(remoteUrl, NtlmPasswordAuthentication.ANONYMOUS);
  1. 用户名访问,直接在路径里面体现用户名和密码,以及域名
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共享文件相关推荐

  1. 超详细:Java 读取 Windows 共享文件夹中的文件,并下载到本地电脑中

    目录 JCIFS 介绍 SMB协议 设置共享文件夹(这里我们选择有密码的方式进行共享) 是否设置密码 创建 smb 协议 测试 使用代码将文件夹里的文件下载到本地 项目常常需要有访问共享文件夹的需求, ...

  2. windows的盘共享挂载到linux下,通过Windows共享文件夹直接挂载到Linux中使用(实验操作)...

    通过Windows共享文件夹直接挂载到Linux中使用 实验背景:如果在Windows上有下载的压缩包,我们可以直接通过Windows的共享直接挂载到Linux中直接使用 实验环境:Windows系统 ...

  3. android 程序 共享文件,如何从Android智能手机访问Windows共享文件夹 | MOS86

    为了从Android设备访问Windows PC上的共享文件,您可以使用名为ES File Explorer File Manager的第三方应用程序.在此之前,您必须检查您是否有足够的权限访问数据. ...

  4. 一步一学Linux与Windows 共享文件Samba (v0.2b)---转自linuxsir

    作者:北南南北,正在增加中... ... 需要您的参与: 来自:LinuxSir.Org 简介:本文只是讲一讲我们最常用的Linux与Windows共享文件,主要是为新手指一指路.如何建立最简单的Sa ...

  5. linux 内网共享文件夹_在Linux下访问Windows共享文件夹

    说明 以下操作以Ubuntu为例,大家可以参考. 我在Ubuntu 14.04和16.04都试过了. Windows共享文件夹 如果局域网内有一台Windows主机,将指定文件夹设为共享,就可以在局域 ...

  6. 使用JCIFS获取远程共享文件

    package com.jadyer.util;    import java.io.File;  import java.io.FileOutputStream;  import java.io.I ...

  7. CentOS6.5挂载windows共享文件夹

    由于工作需要,需要把本机的文件夹共享出去,然后让CentOS服务器临时使用下. 服务器使用的是CentOS系统,而本机使用的win7系统.考虑到是临时使用,所以就不打算搭建FTP和Samba服务器,直 ...

  8. 虚拟机Oracle VM VirtualBox linux系统如何访问windows共享文件夹

    1. 在本机系统设置一个共享文件夹,用于与Ubuntu交互的区域空间.     2.右击状态栏上共享文件夹图标或菜单栏"设备-共享文件夹",打开共享文件夹设置,如图示 3.点击共享 ...

  9. mount挂载windows共享文件夹

    今天在centos 7下挂载windows共享文件夹遇到报错 mount error(115): Operation now in progress Refer to the mount.cifs(8 ...

最新文章

  1. php 跨进程读写,php使用多个进程同时控制文件读写示例
  2. 分享一款超棒的jQuery旋钮插件 - jQuery knob
  3. EasyUI的datebox用法
  4. CentOS6下ssh简介及openssh的应用
  5. Centos下的apache2练习
  6. 基于openstack搭建百万级并发负载均衡器的解决方案
  7. 关于异地高考引发的又一次舆论攻势
  8. js中字符串操作函数
  9. android之XmlSerializer序列化XML(写入) android之XmlSerializer序列化XML(写入)...
  10. dnsmasq安装配置
  11. 类的继承关系声明和访问修饰
  12. 傅里叶光学MATLAB编程系列【1】基本函数
  13. Android签名证书生成
  14. oracle客户端 PLSQL安装配置教程
  15. 计算机技术在图形图像处理中的应用,计算机图形图像处理技术综述
  16. android手机 hdmi,手机的高清输出——MHL和micro HDMI测试
  17. 手刃豆瓣top250排行榜
  18. C语言中side的用法,side的用法总结大全
  19. 心无界,牧云端:华为云与人工智能的野望
  20. 奇安信(2019笔试题)

热门文章

  1. Cloudstack高级网络模式详解
  2. 计算机技术软件考试含金量,计算机软考初级含金量怎么样
  3. 臀大肌(06):跪撑举臂抬腿
  4. 《网优助手》APP隐私申明
  5. c语言oled p14x16str,OLED液晶屏幕(4)串口读取文字并分割,液晶屏幕显示
  6. kill -9 进程号杀不死可以用下面的杀掉 Linux下强制杀死进程的方法详解
  7. MSSQL删除数据库失败
  8. 基于mips内核的Atheros芯片--wlan中的VAP的创建
  9. Mikrotik配置bonding
  10. mysql 列转行 unpivot_SQL 之列转行Unpivot函数