前言
在Microsoft 网 络 系 统 中SMB(Server Message Block 服 务 信 息 块) 协 议 是Windows for Workgroup(WfWg)Windows Windows NT 和LanManager 用 来 实 现 共 享 局 域 网 上 文 件 和 打 印 机 的 协 议 对 于 利 用Linux 和Windows NT 构 建 的 局 域 网 来 说Samba 就 是 为Linux 提 供 的SMB 客 户 程 序/ 服 务 器 程 序 的 软 件 包 其 功 能 是 实 现Windows 和Linux 互 相 共 享 对 方 的 磁 盘 空 间 和 打 印 机通用网络文件系统简称CIFS它事实上是windows平台文件共享的标准协议它是windows explorer网络邻居和映射网络驱动器的底层实现协议JAVA具有天然的平台无关性使用JAVA可以访问任何类型的服务器或客户机上的共享文件系统并且编写的软件产品可以运行于任何平台因此用JAVA访问共享文件系统在企业应用中具有得天独厚的优势
JAVA中的CIFS实现
Jcifs是CIFS在JAVA中的一个实现是samba组织本着linux的精神负责维护开发的一个开源项目这个项目专注于使用java语言对cifs协议的设计和实现他们将jcifs设计成为一个完整的丰富的具有可扩展能力且线程安全的客户端库这一库可以应用于各种java虚拟机访问遵循CIFS/SMB网络传输协议的网络资源类似于javaioFile的接口形式在多线程的工作方式下被证明是有效而容易使用的目前jcifs的最新版本是jcifsb你可以在本文最后列出的参考资料中获得下载这一类库的网址这一版本还支持分布式的文件系统本文尚不涉及这一内容
JAVA/CIFS程序设计
如果你曾经使用过java的文件操作功能那么你将很容易掌握jcifs的开发方法Jcifs通过类似如下的资源url定位一个资源
smb://guest:@/share/atxt
这个url的开始部分smb:// 说明了这是一个smb类型的url接下来的guest和分别是访问共享资源的用户名称和密码@后面是要访问的资源的主机名或IP地址最后是资源的共享文件夹名称和共享资源名
在JAVA程序中使用如下方式获得一个远程共享文件的句柄
SmbFile file = new SmbFile(smb://guest:@/share/atxt);
这里的句柄不仅限于远程的共享文件还可能是共享文件夹isFile()方法和isDirectory()用来判断这个句柄对应的资源的真实属性如果是共享文件夹通过调用它的list()方法将获得其中资源的列表List方法支持过滤器机制有两种过滤器可供使用一种是SmbFileFilter另一种是SmbFilenameFilter这两个在jcifs中作为接口出现你可以根据自己的需要派生出个性化的过滤器实现接口中的accept方法以满足不同业务的需求
SmbFileInputStream是smb文件的输入流它的功能是以流的方式打开一个SmbFile
SmbFileInputStream in = new SmbFileInputStream(file);
SmbFileInputStream提供read方法你可以从这个流中读出远程文件全部的内容
至此你已经掌握了java访问smb文件系统的基本方法
SmbFileOutputStream是smb文件的输入流可以向远程文件系统通过smb写入数据方法与上面类似不再赘述
本文后面附带的源代码是一个完整的例子它完成功能很简单就是将另一台电脑上指定共享文件夹下的某些文件拷贝到本机的指定目录下通过这个例子相信你很容易将它移植到你的开发产品中
第一步设置运行环境将源代码解压缩将lib目录下的名称为jcifsbjar的文件加入到你的操作系统的classpath中使示例程序运行时能够找到这个库
第二步在另一台计算机上建立名称为share的共享文件夹用户名为guest密码也为guest假设这台计算机的ip地址是
第三步在刚才建立的共享文件夹下放置两个文件名称分别为hellotxtbyetxt文件的内容无所谓
第三步在本地计算机上的C盘跟目录下建立一个名称为tmp的空目录置此目录可写
第四步编译运行Samplejava并运行
Java Sample guest guest /share/ c:/tmp/
检查c:\tmp文件夹会发现hellotxt这个文件被复制到了本机而byetxt没有被复制因为Samplejava中使用了过滤器仅允许名称为hello开头的文件被拷贝
后记
对共享文件系统的访问是内部办公系统等涉及到文件迁移的软件产品开发过程中不可回避的课题jCifs是一套针对这一课题完整而强大的解决方案通过它你可以实现对任何共享文件系统的访问