java 操作windows 共享目录方法介绍
发布时间:2012-11-25 18:08:59 作者:佚名
我要评论
用JAVA 开发的SMB 客户端库,利用jcifs 可以操作windows 共享文件,可以得到域用户,实现单点登录,需要的朋友可以参考下
相关知识介绍
1.1 SMB
Microsoft 网络配置中主要采用SMB 形式实现文件共享和打印服务,SMB (服务器消息块)是一种客户端/ 服务器文件共享协议。IBM 于20 世纪80 年代末期开发了服务器信息块(SMB ),用于规范共享网络资源(如目录、文件、打印机以及串行端口)的结构。这是一种请求/ 响应协议。与FTP 协议支持的文件共享不同,SMB 协议中的客户端要与服务器建立长期连接。一旦建立连接,客户端用户就可以访问服务器上的资源,就如同资源位于客户端主机上一样。
从Windows 2000 系列软件开始,Microsoft 修改了软件的基础结构,使其适用SMB 协议。而在以前的Microsoft 产品中,SMB 服务需要使用非TCP/IP 协议族来执行域名解析。从Windows 2000 开始,Microsoft 的所有产品都采用DNS 系统。由此,TCP/IP 协议族可以直接支持SMB 资源共享。
SMB协议中规定了文件系统访问和客户如何请求文件的方式以及SMB 协议进程间通信的方式。所有的SMB 消息都采用一种格式。该格式采用固定大小的文件头,后跟可变 <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script><script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> 大小的参数以及数据组件。
1.2 jcifs
Jcifs <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script><script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> pan>是一个用JAVA 开发的SMB 客户端库,利用jcifs 可以操作windows 共享文件,可以得到域用户,实现单点登录,最新版本为:1.3.12 ,官方网址:http://jcifs.samba.org/
2. 代码实现
Java代码
package uploadSMB;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
public class UploadDownloadUtil {
/**
* Description: 从共享目录拷贝文件到本地
* @Version1.0 Sep 25, 2009 3:48:38 PM
* @param remoteUrl 共享目录上的文件路径
* @param localDir 本地目录
*/
public void smbGet(String remoteUrl,String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if(remoteFile==null){
System.out.println("共享文件不存在");
return;
}
String fileName = remoteFile.getName();
File localFile = new File(localDir+File.separator+fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Description: 从本地上传文件到共享目录
* @Version1.0 Sep 25, 2009 3:49:00 PM
* @param remoteUrl 共享文件目录
* @param localFilePath 本地文件绝对路径
*/
public void smbPut(String remoteUrl,String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(remoteUrl+"/"+fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
UploadDownloadUtil test = new UploadDownloadUtil() ;
// smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
//test.smbGet("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake/test.txt", "c://") ;
test.smbPut("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake", "c://test.txt") ;
}
}
package uploadSMB;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
public class UploadDownloadUtil {
/**
* Description: 从共享目录拷贝文件到本地
* @Version1.0 Sep 25, 2009 3:48:38 PM
* @param remoteUrl 共享目录上的文件路径
* @param localDir 本地目录
*/
public void smbGet(String remoteUrl,String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if(remoteFile==null){
System.out.println("共享文件不存在");
return;
}
String fileName = remoteFile.getName();
File localFile = new File(localDir+File.separator+fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Description: 从本地上传文件到共享目录
* @Version1.0 Sep 25, 2009 3:49:00 PM
* @param remoteUrl 共享文件目录
* @param localFilePath 本地文件绝对路径
*/
public void smbPut(String remoteUrl,String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(remoteUrl+"/"+fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
UploadDownloadUtil test = new UploadDownloadUtil() ;
// smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
//test.smbGet("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake/test.txt", "c://") ;
test.smbPut("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake", "c://test.txt") ;
}
}
2.3 remoteUrl说明
remoteUrl 如何填写是值得注意的
如果是无需密码的共享,则类似如下格式:
smb://ip/sharefolder (例如:smb://192.168.0.77/test )
如果需要用户名、密码,则类似如下格式:
Smb://username:password@ip/sharefolder (例如:smb://chb:123456@192.168.0.1/test )
// smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
//test.smbGet("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake/test.txt", "c://") ;
test.smbPut("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake", "c://test.txt") ;
1.1 SMB
Microsoft 网络配置中主要采用SMB 形式实现文件共享和打印服务,SMB (服务器消息块)是一种客户端/ 服务器文件共享协议。IBM 于20 世纪80 年代末期开发了服务器信息块(SMB ),用于规范共享网络资源(如目录、文件、打印机以及串行端口)的结构。这是一种请求/ 响应协议。与FTP 协议支持的文件共享不同,SMB 协议中的客户端要与服务器建立长期连接。一旦建立连接,客户端用户就可以访问服务器上的资源,就如同资源位于客户端主机上一样。
从Windows 2000 系列软件开始,Microsoft 修改了软件的基础结构,使其适用SMB 协议。而在以前的Microsoft 产品中,SMB 服务需要使用非TCP/IP 协议族来执行域名解析。从Windows 2000 开始,Microsoft 的所有产品都采用DNS 系统。由此,TCP/IP 协议族可以直接支持SMB 资源共享。
SMB协议中规定了文件系统访问和客户如何请求文件的方式以及SMB 协议进程间通信的方式。所有的SMB 消息都采用一种格式。该格式采用固定大小的文件头,后跟可变 <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script><script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> 大小的参数以及数据组件。
1.2 jcifs
Jcifs <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script><script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> pan>是一个用JAVA 开发的SMB 客户端库,利用jcifs 可以操作windows 共享文件,可以得到域用户,实现单点登录,最新版本为:1.3.12 ,官方网址:http://jcifs.samba.org/
2. 代码实现
Java代码
复制代码
代码如下:package uploadSMB;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
public class UploadDownloadUtil {
/**
* Description: 从共享目录拷贝文件到本地
* @Version1.0 Sep 25, 2009 3:48:38 PM
* @param remoteUrl 共享目录上的文件路径
* @param localDir 本地目录
*/
public void smbGet(String remoteUrl,String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if(remoteFile==null){
System.out.println("共享文件不存在");
return;
}
String fileName = remoteFile.getName();
File localFile = new File(localDir+File.separator+fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Description: 从本地上传文件到共享目录
* @Version1.0 Sep 25, 2009 3:49:00 PM
* @param remoteUrl 共享文件目录
* @param localFilePath 本地文件绝对路径
*/
public void smbPut(String remoteUrl,String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(remoteUrl+"/"+fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
UploadDownloadUtil test = new UploadDownloadUtil() ;
// smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
//test.smbGet("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake/test.txt", "c://") ;
test.smbPut("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake", "c://test.txt") ;
}
}
package uploadSMB;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
public class UploadDownloadUtil {
/**
* Description: 从共享目录拷贝文件到本地
* @Version1.0 Sep 25, 2009 3:48:38 PM
* @param remoteUrl 共享目录上的文件路径
* @param localDir 本地目录
*/
public void smbGet(String remoteUrl,String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if(remoteFile==null){
System.out.println("共享文件不存在");
return;
}
String fileName = remoteFile.getName();
File localFile = new File(localDir+File.separator+fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Description: 从本地上传文件到共享目录
* @Version1.0 Sep 25, 2009 3:49:00 PM
* @param remoteUrl 共享文件目录
* @param localFilePath 本地文件绝对路径
*/
public void smbPut(String remoteUrl,String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(remoteUrl+"/"+fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
UploadDownloadUtil test = new UploadDownloadUtil() ;
// smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
//test.smbGet("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake/test.txt", "c://") ;
test.smbPut("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake", "c://test.txt") ;
}
}
2.3 remoteUrl说明
remoteUrl 如何填写是值得注意的
如果是无需密码的共享,则类似如下格式:
smb://ip/sharefolder (例如:smb://192.168.0.77/test )
如果需要用户名、密码,则类似如下格式:
Smb://username:password@ip/sharefolder (例如:smb://chb:123456@192.168.0.1/test )
// smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx
//test.smbGet("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake/test.txt", "c://") ;
test.smbPut("smb://szpcg;jiang.t:xxx@192.168.193.13/Jake", "c://test.txt") ;
相关文章
Windows 11系统里的广告越来越多,弹窗、推荐、提示层出不穷,简直让人抓狂!别急,今天我为大家带来一份超详细的教程,手把手教你如何关闭这些烦人的广告,让你的Win11清2026-04-18
电脑打印机状态错误怎么解决? 快速搞定Windows打印机状态错误的方法
当我们急需打印文件时,电脑右下角弹出的“打印机处于错误状态”或“无法打印”的提示,无疑会让人感到困扰和焦虑,这种“错误状态”看似复杂,但实际上多数问题并非源于硬2026-04-18
电脑网络受限怎么办? Windows提示网络连接受限的解决办法
昨晚加班到一半,突然发现右下角的网络图标多了个黄色叹号,提示“本地连接受限制”,下面我们就来看看解决办法2026-04-18
轻松保护你的电脑隐私! Windows系统如何设置动态锁功能
如果您希望在离开电脑时无需手动操作即可自动锁屏,Windows动态锁功能可通过蓝牙检测手机距离实现该效果,以下是设置此功能的具体步骤2026-04-17
保护电脑数据安全! Windows系统快速关闭磁盘默认共享方法
你可能还不知道,系统默认还开启了硬盘分区(如C盘、D盘)的共享功能,今天我们就来看看一键关闭Windows默认共享,保护电脑数据安全的设置方法2026-04-17
Windows预览窗口大小怎么自由调节? 电脑任务栏预览窗口设置方法
对于Windows系统的深度用户来说,文件预览功能无疑是日常操作中的得力助手,然而,系统默认的预览窗口大小可能并不完全符合每个人的使用习惯,今天,我就为大家带来一个技术2026-04-17
windows无法更改设置怎么办? 电脑不允许修改系统设置无问题的解决办法
想要调整一下系统设置,却发现无论你怎么点来点去,它就是不给你改!这可真是让人欲哭无泪啊!别担心,今天我就来给大家分享一些解决方法,让你的Windows系统设置恢复正常2026-04-17
如何启用项目复选框? Windows系统打开文件复选框设置的教程
Windows复选框,也称为项目复选框,允许您在文件资源管理器中轻松选择多个文件和文件夹,默认情况下,此功能在Windows中是禁用的,但您可以通过进行一些简单的自定义来快速2026-04-16
Windows系统如何设置DPI缩放? 屏幕DPI缩放设置全攻略
你是否遇到过这样的困扰:新买的4K显示器文字模糊发虚?手机屏幕图标小到看不清?这可能并非硬件问题,而是DPI设置在“捣乱”!本文将系统解析DPI设置原理与实操技巧,助你2026-04-16
微软放大招! 所有Windows镜像都将失效 强制执行阶段已到来
最近,微软在win11系统“设置-Windows安全中心-设备安全性”中新增了安全启动检查,由于一个不可忽视的“硬期限”到来,安全启动的旧证书要过期了2026-04-08



最新评论