java访问局域网共享文件或共享文件夹

java访问局域网共享文件或共享文件夹

前言

    准备写这篇博客是因为最近几天由于项目需要访问远程路径下的共享文件,之前没接触过涉及这方面的技术,百度了一番,发现基于java实现这个技术的有--jcifs。现在记录一下一些简单使用过程和遇到的一些问题和解决办法。

简介

  通用Internet文件系统

  在windows主机之间进行网络文件共享是通过使用微软公司自己的CIFS服务实现的。  

  CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机的服务。CIFS 使用客户/服务器模式。客户程序请求远在服务器上的服务器程序为它提供服务。服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB协议(见最后的名词解释)现在是局域网上用于服务器文件访问和打印的协议。象SMB协议一样,CIFS在高层运行,而不象TCP/IP协议那样运行在底层。CIFS可以看做是应用程序协议如文件传输协议和超文本传输协议的一个实现。

  CIFS 可以使您达到以下功能: 

  1.访问服务器本地文件并读写这些文件 

     2.与其它用户一起共享一些文件块 

  3.在断线时自动恢复与网络的连接 

   4.使用西欧字符文件名 
   一般来说,CIFS使用户得到比FTP更好的对文件的控制。它提供潜在的更直接地服务器程序接口,这比使用HTTP协议的浏览器更好。CIFS最典型的应用是windows用户能够从“网上邻居”中找到网络中的其他主机并访问其中的共享文件夹.
  CIFS 是开放的标准而且已经被作为Internet应用程序标准被提交到IETF。

      JCIFS是CIFS 在JAVA中的一个实现,是samba组织负责维护开发的一个开源项目,专注于使用java语言对cifs协议的设计和实现。他们将jcifs设计成为一个完整的,丰富的,具有可扩展能力且线程安全的客户端库。这一库可以应用于各种java虚拟机访问遵循CIFS/SMB网络传输协议的网络资源。类似于java.io.File的接口形式,在多线程的工作方式下被证明是有效而容易使用的。

  上面这段是在csdn看到的,链接:https://blog.csdn.net/qq_33223299/article/details/80092897

简单使用

  使用单元测试

        1、登录:填写服务器ip,域名、登录账号、登录密码,可以查看是否能正常访问。

1       //登陆
2             UniAddress address = UniAddress.getByName("ip");//
3             NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("域名", "登陆账号", "登陆密码");
4             SmbSession.logon(address, auth);

  2、获取远程文件资源:

    方式1:需要域名的情况

      smb://域名;登录账号:登录密码@服务器ip/文件夹名称/
   方式2:不需要域名的情况
      smb://登录账号:登录密码@服务器ip/文件夹名称/
   方式3:不需要用户名密码的情况
      smb://服务器ip/文件夹名称/
需要注意的问题:1、如果是文件夹后边需要加 '/' 斜杠,不然操作方法的时候回报错。
        2、第二种情况是我自己遇到的,我访问的共享文件是在某个域中,但是不写域名也能访问成功,格式是这样的:smb://;登录账号:登录密码@服务器ip/文件夹名称/
但是不能省略域名和登录账号之间的 ';' 分号。没看源码所以不知道什么情况,有知道的可以分享下。
      SmbFile smbFile = new SmbFile("smb://域名;登录账号:登录密码@服务器ip/文件夹名称/");
        if(smbFile.isDirectory()){//判断是否是文件夹,判断是否是文件:smbFile.isFile(),这个跟java.io.File的方法类似
                SmbFile[] listFiles = smbFile.listFiles();//获取所有文件
                System.out.println(listFiles.length);//文件数量
                for (SmbFile smbFile2 : listFiles) {
                    System.out.println(smbFile2.getName());//文件名
            InputStream is = smbFile.getInputStream();//获取输入流
System.out.println(smbFile2.getPath());//smb协议下的服务器文件路径 } }

  3、读取文件速度太慢,当你想把共享文件下载到本地的时候,你会发现很慢。这里提供一个解决方案。

    

System.setProperty("jcifs.smb.client.dfs.disabled","true");//禁用dfs,提高读取速度

  在new SmbFile();之前设置。

      4、读取windows10下的共享文件失败。是因为windows10下默认没勾选SMB 1.0/CIFS文件共享支持,也就是没启用SMB1.0协议,jcifs只支持1.0。

            解决方案:打开控制面板-->程序和功能-->点击左侧下的启用或关闭windows功能-->勾选SMB 1.0/CIFS文件共享支持,重启系统。

 

posted @ 2020-04-03 10:55  追梦950  阅读(7126)  评论(0编辑  收藏  举报