Java读写Windows共享文件夹的方法实例
项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片、文件等。那么如何使用Java读写Windows共享文件夹呢?
Java可以使用JCIFS框架对Windows共享文件夹进行读写,就这个框架可以让我们像访问本地文件夹一下访问远程文件夹。
JCIFS的网址:http://jcifs.samba.org/
JCIFS是使用纯Java开发的一个开源框架,通过smb协议访问远程文件夹。该框架同时支持Windows共享文件夹和Linux共享文件夹,不过,Linux共享文件夹需要安装Samba服务软件(官网:http://www.samba.org/)。
SMB(ServerMessagesBlock,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOSoverTCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。
本文主要学习一下使用Java访问Windows共享文件夹的方法。
首先找一台Windows机器,在任意位置创建文件夹:sharedFolder,并设置为共享,设置共享用户名:share,密码:admin。
(Windows7下设置共享文件夹方法:Windows7下设置共享文件夹方法:https://www.nhooo.com/os/windows/78034.html)
不论是Windows还是Linux的共享文件夹,使用Javasmb访问共享文件夹的代码都是一样的,只是Windows与Linux配置共享文件夹的方式不一样。
测试代码如下:
InputStreamin=null; OutputStreamout=null; try{ //获取图片 FilelocalFile=newFile("C:/testjpg"); StringremotePhotoUrl="smb://share:admin@11/sharedFolder/";//存放图片的共享目录 SimpleDateFormatfmt=newSimpleDateFormat("yyyyMMddHHmmssSSS_"); SmbFileremoteFile=newSmbFile(remotePhotoUrl+"/"+fmtformat(newDate())+localFilegetName()); remoteFileconnect();//尝试连接 in=newBufferedInputStream(newFileInputStream(localFile)); out=newBufferedOutputStream(newSmbFileOutputStream(remoteFile)); byte[]buffer=newbyte[4096]; intlen=0;//读取长度 while((len=inread(buffer,0,bufferlength))!=-1){ outwrite(buffer,0,len); } outflush();//刷新缓冲的输出流 } catch(Exceptione){ Stringmsg="发生错误:"+egetLocalizedMessage(); Systemoutprintln(msg); } finally{ try{ if(out!=null){ outclose(); } if(in!=null){ inclose(); } } catch(Exceptione){} }
以上代码中,使用了JCIFS框架提供的SmbFile类,这个类和Java的File类比较相似,使用这个类的对象,可以处理远程文件的读写。使用File对象读取本地文件,然后使用SmbFile对象写入远程文件。SmbFile的connect()方法可以尝试连接远程文件夹,如果账号或密码错误,将抛出连接异常。
当下载远程文件时,使用SmbFile对象读取远程文件即可,代码如下:
InputStreamin=null; ByteArrayOutputStreamout=null; try{ //创建远程文件对象 StringremotePhotoUrl="smb://share:admin@11/sharedFolder/testjpg"; SmbFileremoteFile=newSmbFile(remotePhotoUrl); remoteFileconnect();//尝试连接 //创建文件流 in=newBufferedInputStream(newSmbFileInputStream(remoteFile)); out=newByteArrayOutputStream((int)remoteFilelength()); //读取文件内容 byte[]buffer=newbyte[4096]; intlen=0;//读取长度 while((len=inread(buffer,0,bufferlength))!=-1){ outwrite(buffer,0,len); } outflush();//刷新缓冲的输出流 returnouttoByteArray(); } catch(Exceptione){ Stringmsg="下载远程文件出错:"+egetLocalizedMessage(); Systemoutprintln(msg); } finally{ try{ if(out!=null){ outclose(); } if(in!=null){ inclose(); } } catch(Exceptione){} }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。