在Java程序中访问Windows共享文件系统

来源:互联网 发布:nginx 多网站 编辑:程序博客网 时间:2024/05/13 18:07

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就会帮你搞定身份验证的事,粉简单的。