君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

最近需用使用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代码  收藏代码
  1. public void downloadViaShare(final String ip,final String user,final String password,final String <span style="color: #000000;">dir</span>)  
  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<fileList.length;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( 1, ( timeTaken / 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代码  收藏代码
  1. public void downloadViaNFS(final String ip,final String user,final String password,final String dir)  
  2.     {  
  3.         logger.debug("NFS download begin!");  
  4.         try {      
  5.               
  6.             String url = "nfs://"+ip+"/"+dir;               
  7.                     XFile xf = new XFile(url);  
  8.             if (xf.exists())  
  9.             {  
  10.                 logger.debug("URL is OK!");  
  11.             }else  
  12.             {  
  13.                 logger.debug("URL is bad!");  
  14.                 return;  
  15.             }  
  16.                           
  17.             XFileExtensionAccessor nfsx = (XFileExtensionAccessor)xf.getExtensionAccessor();  
  18.             if(!nfsx.loginPCNFSD(ip, user, password))  
  19.             {  
  20.                 logger.debug("login failed!");return;  
  21.             }  
  22.               
  23.             String [] fileList = xf.list();  
  24.             XFile temp = null;  
  25.             long startTime = System.currentTimeMillis();  
  26.             int filesz = 0;  
  27.             for(String file:fileList)  
  28.             {  
  29.                 temp = new XFile(url+"/"+file);  
  30.                 XFileInputStream  in  = new XFileInputStream(temp)  ;  
  31.                 XFileOutputStream out = new XFileOutputStream(tempDir+File.separator+file);  
  32.   
  33.                 int c;          
  34.                 byte[] buf = new byte[8196];             
  35.                   
  36.                           
  37.   
  38.                 while ((c = in.read(buf)) > 0) {                  
  39.                      filesz += c;                  
  40.                      out.write(buf, 0, c);                       
  41.                 }              
  42.   
  43.                 logger.debug(file +" is downloaded!");         
  44.                 in.close();              
  45.                 out.close();          
  46.                 if (temp.canWrite())  
  47.                 {  
  48.                     temp.delete();  
  49.                     logger.debug(file + " is deleted!");  
  50.                 }else  
  51.                 {  
  52.                     logger.debug(file + " can not be delted!");  
  53.                 }  
  54.             }  
  55.                 long endTime = System.currentTimeMillis();  
  56.                 long timeDiff = endTime - startTime;  
  57.                 int rate = (int) ((filesz /1000) / (timeDiff / 1000.0));  
  58.                 logger.debug(filesz + " bytes copied @ " + rate + "Kb/sec");  
  59.              
  60.             }catch (IOException e) {          
  61.                 logger.debug(e);          
  62.             }  
  63.           
  64.     }  

 

posted on 2013-07-30 01:38  刺猬的温驯  阅读(2954)  评论(0)    收藏  举报