Java访问共享目录(samba和NFS配置…

 

      最近需用使用java访问linux下的共享目录,实现文件下载和上传, 由于linux共享文件主要采用两种方式,samba和NFS,samba是基于Microsoft的smb/cifs协议, NFS网络文件系统(Network File System)则是另一种协议. 对这两种方式的配置和实现代码如下:(配置在Ubuntu下完成) 

    一,samba 

       (1)配置: 

             a ) 建立共享目录: mkdir /home/pirate/smbshare,  chmod 777 smbshare 

             b) 安装samba, sudo apt-get install samba,  sudo apt-get install smbfs 

             c) 修改samba配置文件, sudo gedit /etc/samba/smb.conf, 在文件最后添加如下行: 


               [smbshare]  #-----共享名字, 客户端访问时需使用这个名字 
               path = /home/pirate/smbshare  
               available = yes 
               browsealbe = yes 
               public = yes 
               writable = yes 

     d)  创建共享用户: sudo useradd aaa 

      f)  重启samba, sudo /etc/init.d/samba restart 

(2)  java访问

   

    访问Samba共享依赖于一个第三方包:jcifs-1.3.15.jar, 下载地址http://jcifs.samba.org/

Java代码  dir) { logger.debug("Share(SMB) download!"); String newDir = dir; String url = ""; SmbFile [] fileList = null; FileOutputStream fos = null; SmbFileInputStream smbIs = null; byte [] buffer = new byte[8192]; int readBytes = 0; int totalBytes = 0; if (!dir.endsWith("/")) //directory must end with "/" newDir = dir+"/"; url = "smb://"+user+":"+password+"@"+ip+"/"+newDir; long startTime = System.currentTimeMillis(); try { SmbFile shareDir = new SmbFile(url); if(shareDir.isDirectory()) { fileList = shareDir.listFiles(); for(int i=0;i 0 ) { fos.write(buffer,0,readBytes); totalBytes += readBytes; } smbIs.close(); fos.close(); logger.debug(fileList[i].getName() + " is downloaded!"); try { fileList[i].delete(); }catch(SmbAuthException smbae ) { logger.debug(fileList[i].getName()+" can not be deleted!"); } } } long endTime = System.currentTimeMillis(); long timeTaken = endTime-startTime; logger.debug(totalBytes +"bytes downloaded in " + timeTaken/1000 + " seconds at "+ (( totalBytes / 1000 ) / Math.max( 1, ( timeTaken / 1000 ))) + "Kb/sec"); } }catch(MalformedURLException urle) { logger.debug("Incorrect URL format!"); }catch (SmbException smbe) { smbe.printStackTrace(); logger.debug(this.getClass().getName()+"||"+smbe.getMessage()); }catch(IOException ioe) { ioe.printStackTrace(); logger.debug(this.getClass().getName()+"||"+ioe.getMessage()); }finally { try { smbIs.close(); fos.close(); }catch(Exception smbe) { logger.debug(this.getClass().getName()+"||"+smbe.getMessage()); } } }" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. public void downloadViaShare(final String ip,final String user,final String password,final String "color: #000000;">dir 
  2.      
  3.         logger.debug("Share(SMB) download!");  
  4.           
  5.         String newDir dir;          
  6.         String url ""   
  7.         SmbFile [] fileList null 
  8.         FileOutputStream fos null 
  9.         SmbFileInputStream smbIs null 
  10.         byte [] buffer new byte[8192];  
  11.         int readBytes 0 
  12.         int totalBytes 0 
  13.               
  14.         if (!dir.endsWith("/"))  //directory must end with "/"        
  15.                                 newDir dir+"/"   
  16.         url "smb://"+user+":"+password+"@"+ip+"/"+newDir;  
  17.           
  18.         long startTime System.currentTimeMillis();  
  19.         try  
  20.             SmbFile shareDir new SmbFile(url);  
  21.             if(shareDir.isDirectory())  
  22.              
  23.                 fileList shareDir.listFiles();    
  24.                 for(int i=0;i
  25.                  
  26.                     if(fileList[i].isFile())  
  27.                      
  28.                         smbIs new SmbFileInputStream((SmbFile)fileList[i]);  
  29.                         fos new FileOutputStream(new File(tempDir+File.separator+fileList[i].getName()));  
  30.                         while((readBytes smbIs.read(buffer)) 0  
  31.                          
  32.                             fos.write(buffer,0,readBytes);  
  33.                             totalBytes += readBytes;  
  34.                          
  35.                         smbIs.close();  
  36.                         fos.close();  
  37.                         logger.debug(fileList[i].getName() is downloaded!");  
  38.                         try  
  39.                          
  40.                             fileList[i].delete();    
  41.                         }catch(SmbAuthException smbae  
  42.                          
  43.                             logger.debug(fileList[i].getName()+can not be deleted!");  
  44.                          
  45.                      
  46.                  
  47.                 long endTime System.currentTimeMillis();  
  48.                 long timeTaken endTime-startTime;  
  49.                 logger.debug(totalBytes +"bytes downloaded in " timeTaken/1000 seconds at "(( totalBytes 1000 Math.max( 1timeTaken 1000 ))) "Kb/sec");  
  50.              
  51.         }catch(MalformedURLException urle)  
  52.          
  53.             logger.debug("Incorrect URL format!");  
  54.         }catch (SmbException smbe)  
  55.             smbe.printStackTrace();  
  56.             logger.debug(this.getClass().getName()+"||"+smbe.getMessage());  
  57.         }catch(IOException ioe)  
  58.          
  59.             ioe.printStackTrace();  
  60.             logger.debug(this.getClass().getName()+"||"+ioe.getMessage());  
  61.         }finally  
  62.          
  63.             try  
  64.              
  65.                 smbIs.close();  
  66.                 fos.close();  
  67.             }catch(Exception smbe)  
  68.              
  69.                 logger.debug(this.getClass().getName()+"||"+smbe.getMessage());  
  70.              
  71.          
  72.           
  73.      

 

二,NFS

      (1) 配置

          a) 安装NFS, sudo apt-get install nfs-kernel-server

          b) 建立共享目录: mkdir /home/pirate/nfsshare

          c) 编辑配置:  sudo gedit /etc/exports ,在最后添加如下行:

                 /home/pirate/nfsshare  *(rw,sync,no_all_squash),含义为:

                 共享目录 允许访问的网络段(读写权限,数据发送方式,客户端权限)

 其它Ubuntu nfs常用的参数有:
ro 只读访问
rw 读写访问sync 所有数据在请求时写入共享
async nfs在写入数据前可以响应请求
secure nfs通过1024以下的安全TCP/IP端口发送
insecure nfs通过1024以上的端口发送
wdelay 如果多个用户要写入nfs目录,则归组写入(默认)
no_wdelay 如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置。
hide 在nfs共享目录中不共享其子目录
no_hide 共享nfs目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID

d)  重启 NFS: sudo service portmap restart , sudo service nfs-kernel-server restart

e)  测试: showmount -e,查看是否有该目录的共享

(2)  代码

话说这段代码虽然很简单,却费了我不少力气。JDK本身是没有访问NFS的功能,只能用第三方包了,google后发觉用java访问NFS的应用很少,竟然没找到可用的示例,远不如samba那么多,而且只有sun的webnfs可用来访问NFS,在http://yanfs.dev.java.net  上只有一个一个的散装源码, 打包后的jar都没地方下,连API文档都没有. 愁煞我也. 找来找去,根据sun的在线文档摸索出了点头绪.

 

 

Java代码 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值