最近需用使用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代码  

public void downloadViaShare(final String ip,final String user,final String password,final String 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

{

if(fileList[i].isFile())

{

smbIs = new SmbFileInputStream((SmbFile)fileList[i]);

fos = new FileOutputStream(new File(tempDir+File.separator+fileList[i].getName()));

while((readBytes = smbIs.read(buffer)) > 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());

}

}

}

二,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代码  

public void downloadViaNFS(final String ip,final String user,final String password,final String dir)

{

logger.debug("NFS download begin!");

try {

String url = "nfs://"+ip+"/"+dir;

XFile xf = new XFile(url);

if (xf.exists())

{

logger.debug("URL is OK!");

}else

{

logger.debug("URL is bad!");

return;

}

XFileExtensionAccessor nfsx = (XFileExtensionAccessor)xf.getExtensionAccessor();

if(!nfsx.loginPCNFSD(ip, user, password))

{

logger.debug("login failed!");return;

}

String [] fileList = xf.list();

XFile temp = null;

long startTime = System.currentTimeMillis();

int filesz = 0;

for(String file:fileList)

{

temp = new XFile(url+"/"+file);

XFileInputStream  in  = new XFileInputStream(temp)  ;

XFileOutputStream out = new XFileOutputStream(tempDir+File.separator+file);

int c;

byte[] buf = new byte[8196];

while ((c = in.read(buf)) > 0) {

filesz += c;

out.write(buf, 0, c);

}

logger.debug(file +" is downloaded!");

in.close();

out.close();

if (temp.canWrite())

{

temp.delete();

logger.debug(file + " is deleted!");

}else

{

logger.debug(file + " can not be delted!");

}

}

long endTime = System.currentTimeMillis();

long timeDiff = endTime - startTime;

int rate = (int) ((filesz /1000) / (timeDiff / 1000.0));

logger.debug(filesz + " bytes copied @ " + rate + "Kb/sec");

}catch (IOException e) {

logger.debug(e);

}

}

java 调用 nfs_java 访问共享目录(samba和NFS配置及实现)相关推荐

  1. 网络共享服务Samba和NFS配置

    samba是一个工具套件,在Unix上实现SMB(Server Message Block)协议,或者称之为NETBIOS/LanManager协议.SMB协议通常是被windows系列用来实现磁盘和 ...

  2. Java调用opencv实现图片去水印

    opencv实现图片去水印案例 Java调用opencv实现图片去水印 环境安装配置 IDEA下开发配置 测试案例 Java调用opencv实现图片去水印 最近项目中遇到个需求,图片去水印下载,由于上 ...

  3. android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

    2019独角兽企业重金招聘Python工程师标准>>>                                            Android 从Java调用C/C++ ...

  4. 网络文件系统(samba、nfs、iscsi)

    一.samba服务简介 1.smb协议 smb(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同操作系统的计算机之间提供文件及 ...

  5. 第12章 使用Samba或NFS实现文件共享

    章节简述: 本章节为读者讲述文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法. 详细逐条讲解Samba服务配置参数,演示安全共享文件的配置策方法,并使用autofs服务程序自动挂载 ...

  6. java调用shell脚本并传递参数

    最近业务上需要java调用执行shell脚本进行一些业务处理,写了个demo,记录下. 主要代码 @RequestMapping("/copy/database")@Respons ...

  7. Linux学习笔记RHEL 7(十)--使用Vsftpd服务传输文件和使用Samba或NFS实现文件共享

    一.文件传输协议 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性 ...

  8. samba,nfs,iscsi网络文件系统

    目录 一.samba服务介绍 二.windows系统下实现文件共享 二.Linux中用samba服务实现文件共享 1.samba 的安装与启用 1. 添加samba用户(samba用户必须是本地用户) ...

  9. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法

    linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso {     static {         ...

最新文章

  1. 线程间操作无效:从不是创建控件的线程访问它的三种方法
  2. 美团酒店Node全栈开发实践
  3. margin-top的百分比是相对父元素的哪个值
  4. 数据中心调试的重新思考
  5. 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)
  6. 浅谈MyBatis二级缓存
  7. EBS业务学习之应付INVOICE类型
  8. 最新自然指数出炉,哪些高校表现突出?
  9. T-SQL 操作文件 具体解释
  10. python爬虫入门四:BeautifulSoup库(转)
  11. Javascript第五章删除、克隆、插入、替换方法源码第九课
  12. catkin_make和cmake
  13. 打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器
  14. oracle mysql认证考试流程_Oacle认证考试:Oracle移植到MySQL注意事项
  15. CSS选择器优先级以及权重计算方法
  16. Windows驱动开发WDM
  17. nodejs gm 中文 linux,nodejs gm drawText使用(中文、字体、大小及颜色)
  18. html表单查重,毕业论文的表格会被查重吗?
  19. MySQL讲义第 53 讲——select 查询之 select 语句执行过程分析
  20. 测试人员必备工作技能

热门文章

  1. C语言fseek函数了解
  2. 「我的孩子最终没有出生,你们却还在推送育儿广告」
  3. 怎么检查网站的死链接呢?
  4. 在云服务器上部署web项目(CVM)
  5. C#高级--Expression详解
  6. 用 JavaScript 五分钟将 Siri 接入 ChatGPT(含全部源码)
  7. 如何学习数据结构?(纯干货)
  8. C++类的实例:Stock(股票)类。
  9. 怎样理解高内聚低耦合?
  10. 北京市高等教育英语听力计算机考试,北京市2021年普通高考第一次英语听力机考开考_学历教育网...