您的位置:首页 > 理论基础 > 计算机网络

jcifs 详解读取网络共享文件数据

2014-05-15 10:19 288 查看
时隔1年半,没有发过新的帖子了,也没怎么来过CSDN逛逛了,人也懒散了。

今天收到网友的提问,才回来看看,觉得应该再写点什么出来,不过,发现自己研究是不是太深入,写不出那么高深的东西,那就写点肤浅的东西吧。

找来找去,想到写jcifs读取网络共享文件数据,先百度了一下,发现到处都是copy,而且不够详细,有些细节的地方没有注意到,所以写在下篇博客。(啊喂,是不是有点啰嗦了。。)

好,那么开始吧,先介绍一下jcifs:

CIFS (Common Internet File System)



  通用Internet文件系统

  在windows主机之间进行网络文件共享是通过使用微软公司自己的CIFS服务实现的。 

  CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机的服务。CIFS 使用客户/服务器模式。客户程序请求远在服务器上的服务器程序为它提供服务。服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB协议(见最后的名词解释)现在是局域网上用于服务器文件访问和打印的协议。象SMB协议一样,CIFS在高层运行,而不象TCP/IP协议那样运行在底层。CIFS可以看做是应用程序协议如文件传输协议和超文本传输协议的一个实现。
(转载的,人家也是转载的,没标明出处╮(╯▽╰)╭)。

下面还是来擅长的代码吧.
第一步:搞清楚你所有读取的共享文件的目录结构及IP地址,如果需要用户权限的话,那么你就要知道用户名和密码是多少。
例1:smb://userName:password@ip/filePath(这种情况是需要用户名密码的情况下输入的条件)
例2:smb://ip/filePath(这种情况是不需要用户名和密码的)
注意:需不需要用户名密码这是必须要知道的,不然无法读取,可以自己测试一下,(ctrl+r 输入://192.168.0.12 回车,如果需要账户名密码的话,会弹出一个对话框的)
第二步:提供本地保存文件的地址目录;
例:E://12 (文件夹必须事先创建好,或者在程序中创建)

接下来上代码:
//获取客户端所有EXP文件
List<String> fileNames = Smb.getFileNamesFromSmb("smb://Administrator:zwt1314521zw@192.168.6.138/share/");
for (String fileName : fileNames) {
File file = Smb.readFromSmb("smb://Administrator:zwt1314521zw@192.168.6.138/share/"+fileName,"E://138");
}
这里就获得到了共享文件夹下面的所有文件了,这样写的目的在于可以再for循环中根据文件名称过滤掉一些已经获取到的,我这里把过滤的代码去掉了,也就是一个if判断而已.

下面是Smb类的代码:
package com.genertech.unit;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;

public class Smb {
public static List<String> getFileNamesFromSmb(String smbMachine){
SmbFile file;
SmbFile[] files = null;
try {
file = new SmbFile(smbMachine);
files = file.listFiles();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SmbException e) {
e.printStackTrace();
}
List<String> fileNames = new ArrayList<String>();
for (SmbFile smbFile : files) {
if(smbFile.getName().indexOf(".EXP")!=-1){
fileNames.add(smbFile.getName());
}
}
return fileNames;
}
/**
* 从smbMachine读取文件并存储到localpath指定的路径
*
* @param smbMachine
*            共享机器的文件,如smb://xxx:xxx@10.108.23.112/myDocument/测试文本.txt,xxx:xxx是共享机器的用户名密码
* @param localpath
*            本地路径
* @return
*/
public static File readFromSmb(String smbMachine,String localpath){
File localfile=null;
InputStream bis=null;
OutputStream bos=null;
List<File> files = new ArrayList<>();
try {
SmbFile rmifile = new SmbFile(smbMachine);
String filename=rmifile.getName();
bis=new BufferedInputStream(new SmbFileInputStream(rmifile));
localfile=new File(localpath+File.separator+filename);
bos=new BufferedOutputStream(new FileOutputStream(localfile));
int length=rmifile.getContentLength();
byte[] buffer=new byte[length];
bis.read(buffer);
bos.write(buffer);
try {
bos.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
files.add(localfile);
} catch (Exception e) {
e.printStackTrace();
}
return localfile;
}
public static boolean removeFile(File file) {
return file.delete();
}
}


大概就这些,中间大家可以根据自己的需要加上一些其他的功能,有问题请留言。
jcifs可从http://jcifs.samba.org/下载;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: