相关知识介绍
SMB
Microsoft网络配置中主要采用SMB形式实现文件共享和打印服务SMB(服务器消息块)是一种客户端/服务器文件共享协议IBM于世纪年代末期开发了服务器信息块(SMB)用于规范共享网络资源(如目录文件打印机以及串行端口)的结构这是一种请求/响应协议与FTP协议支持的文件共享不同SMB协议中的客户端要与服务器建立长期连接一旦建立连接客户端用户就可以访问服务器上的资源就如同资源位于客户端主机上一样
从Windows 系列软件开始Microsoft修改了软件的基础结构使其适用SMB协议而在以前的Microsoft产品中SMB服务需要使用非TCP/IP协议族来执行域名解析从Windows 开始Microsoft的所有产品都采用DNS系统由此TCP/IP协议族可以直接支持SMB资源共享
SMB协议中规定了文件系统访问和客户如何请求文件的方式以及SMB协议进程间通信的方式所有的SMB消息都采用一种格式该格式采用固定大小的文件头后跟可变 <script src=_mce/themes/advanced/langs/zhjs type=text/javascript></script><script src=_mce/plugins/syntaxhl/langs/zhjs type=text/javascript></script> 大小的参数以及数据组件
jcifs
Jcifs <script src=_mce/themes/advanced/langs/zhjs type=text/javascript></script><script src=_mce/plugins/syntaxhl/langs/zhjs type=text/javascript></script> pan>是一个用JAVA开发的SMB客户端库利用jcifs可以操作windows共享文件可以得到域用户实现单点登录最新版本为官方网址
代码实现
package uploadSMB;
import javaioBufferedInputStream;
import javaioBufferedOutputStream;
import javaioFile;
import javaioFileInputStream;
import javaioFileOutputStream;
import javaioIOException;
import javaioInputStream;
import javaioOutputStream;
import jcifssmbSmbFile;
import jcifssmbSmbFileInputStream;
import jcifssmbSmbFileOutputStream;
public class UploadDownloadUtil {
/**
* Description: 从共享目录拷贝文件到本地
* @Version Sep :: PM
* @param remoteUrl 共享目录上的文件路径
* @param localDir 本地目录
*/
public void smbGet(String remoteUrlString localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if(remoteFile==null){
Systemoutprintln(共享文件不存在);
return;
}
String fileName = remoteFilegetName();
File localFile = new File(localDir+Fileseparator+fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[];
while(inread(buffer)!=){
outwrite(buffer);
buffer = new byte[];
}
} catch (Exception e) {
eprintStackTrace();
} finally {
try {
outclose();
inclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
/**
* Description: 从本地上传文件到共享目录
* @Version Sep :: PM
* @param remoteUrl 共享文件目录
* @param localFilePath 本地文件绝对路径
*/
public void smbPut(String remoteUrlString localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFilegetName();
SmbFile remoteFile = new SmbFile(remoteUrl+/+fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[];
while(inread(buffer)!=){
outwrite(buffer);
buffer = new byte[];
}
} catch (Exception e) {
eprintStackTrace();
} finally {
try {
outclose();
inclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
public static void main(String[] args){
UploadDownloadUtil test = new UploadDownloadUtil() ;
// smb:域名;用户名:密码@目的IP/文件夹/文件名xxx
//testsmbGet(smb://szpcg;jiangt:xxx@/Jake/testtxt c://) ;
testsmbPut(smb://szpcg;jiangt:xxx@/Jake c://testtxt) ;
}
}
remoteUrl说明
remoteUrl如何填写是值得注意的
如果是无需密码的共享则类似如下格式
smb://ip/sharefolder(例如smb:///test)
如果需要用户名密码则类似如下格式
Smb://username:password@ip/sharefolder(例如smb://chb:@/test)
// smb:域名;用户名:密码@目的IP/文件夹/文件名xxx
//testsmbGet(smb://szpcg;jiangt:xxx@/Jake/testtxt c://) ;
testsmbPut(smb://szpcg;jiangt:xxx@/Jake c://testtxt) ;