java 调用 nfs_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代码
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配置及实现)相关推荐
- 网络共享服务Samba和NFS配置
samba是一个工具套件,在Unix上实现SMB(Server Message Block)协议,或者称之为NETBIOS/LanManager协议.SMB协议通常是被windows系列用来实现磁盘和 ...
- Java调用opencv实现图片去水印
opencv实现图片去水印案例 Java调用opencv实现图片去水印 环境安装配置 IDEA下开发配置 测试案例 Java调用opencv实现图片去水印 最近项目中遇到个需求,图片去水印下载,由于上 ...
- android开发教程(3)— jni编程之采用SWIG从Java调用C/C++
2019独角兽企业重金招聘Python工程师标准>>> Android 从Java调用C/C++ ...
- 网络文件系统(samba、nfs、iscsi)
一.samba服务简介 1.smb协议 smb(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同操作系统的计算机之间提供文件及 ...
- 第12章 使用Samba或NFS实现文件共享
章节简述: 本章节为读者讲述文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法. 详细逐条讲解Samba服务配置参数,演示安全共享文件的配置策方法,并使用autofs服务程序自动挂载 ...
- java调用shell脚本并传递参数
最近业务上需要java调用执行shell脚本进行一些业务处理,写了个demo,记录下. 主要代码 @RequestMapping("/copy/database")@Respons ...
- Linux学习笔记RHEL 7(十)--使用Vsftpd服务传输文件和使用Samba或NFS实现文件共享
一.文件传输协议 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性 ...
- samba,nfs,iscsi网络文件系统
目录 一.samba服务介绍 二.windows系统下实现文件共享 二.Linux中用samba服务实现文件共享 1.samba 的安装与启用 1. 添加samba用户(samba用户必须是本地用户) ...
- eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法
linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso { static { ...
最新文章
- 线程间操作无效:从不是创建控件的线程访问它的三种方法
- 美团酒店Node全栈开发实践
- margin-top的百分比是相对父元素的哪个值
- 数据中心调试的重新思考
- 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)
- 浅谈MyBatis二级缓存
- EBS业务学习之应付INVOICE类型
- 最新自然指数出炉,哪些高校表现突出?
- T-SQL 操作文件 具体解释
- python爬虫入门四:BeautifulSoup库(转)
- Javascript第五章删除、克隆、插入、替换方法源码第九课
- catkin_make和cmake
- 打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器
- oracle mysql认证考试流程_Oacle认证考试:Oracle移植到MySQL注意事项
- CSS选择器优先级以及权重计算方法
- Windows驱动开发WDM
- nodejs gm 中文 linux,nodejs gm drawText使用(中文、字体、大小及颜色)
- html表单查重,毕业论文的表格会被查重吗?
- MySQL讲义第 53 讲——select 查询之 select 语句执行过程分析
- 测试人员必备工作技能