本文涉及的几个关键字解释:
SMB: Server Message Block, 用于共享例如文件、打印机、串口或者是命名管道等用于通讯的抽象对象; CIFS: Common Internet File System, SMB的增强版,Windows 2000/XP实现了该协议; JCIFS: 一个实现了CIFS的纯Java项目,无须任何的本地库。
JCIFS的网址: http://jcifs.samba.org/
下面我们看一个非常简单的例子,在运行这个例子之前必须准备两台机器A、B,其中我们A是我们程序运行所在的机器,而B则是被访问的机器,仅用B上的Guest用户,而且A当前的用户不能存在于B机器中,也就是说当我们通过资源管理器访问 \\B 的时候,会要求输入用户名以及口令,如下图所示:
这个时候A机器上的程序就不能通过例如 \\B\folder\1.txt 这样的路径来访问B机器上共享文件夹folder中的1.txt文件,也就是说Java中自带的File,FileInputStream类已经不起作用了,不信? 不信你丫试试
但是借助于JCIFS你就可以很容易的访问到文件1.txt的内容,我们先来看这个简单的例子:
import jcifs.smb.*;
public class Demo{ public static void main(String[] args) throws Exception{ //将user和password换成是B机器上的用户名以及口令 SmbFileInputStream in = new SmbFileInputStream("smb://user:password@B/folder/1.txt" ); byte[] b = new byte[8192]; int n; while(( n = in.read( b )) > 0 ) { System.out.write( b, 0, n ); } } }
编译并运行这面的例子便可以打印文件 1.txt 的内容。 把上面例子中的密码填写成一个错误的密码再运行程序,便会得到 jcifs.smb.SmbAuthException 异常。
写文件也是一个道理,关于文件的操作JCIFS提供了这么几个类:SmbFile,SmbFileInputStream,SmbFileOutputStream,具体的用户跟Java中对应的类差不多。
JCIFS中文件的URL也就是smb_url,格式为:smb://{user}:{password}@{host}/{path} ,只要填好这个URL,JCIFS就会帮你搞定身份验证的事,粉简单的。 |