jcifs 具体解释读取网络共享文件数据

时隔1年半,没有发过新的帖子了,也没怎么来过CSDN逛逛了,人也懒散了。

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

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

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

CIFS (Common Internet File System) 

  通用Internet文件系统

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

  CIFS 是一个新提出的协议,它使程序能够訪问远程Internet计算机上的文件并要求此计算机的服务。CIFS 使用客户/server模式。客户程序请求远在server上的server程序为它提供服务。server获得请求并返回响应。

CIFS是公共的或开放的SMB协议版本号,并由Microsoft使用。

SMB协议(见最后的名词解释)如今是局域网上用于server文件訪问和打印的协议。象SMB协议一样,CIFS在高层执行,而不象TCP/IP协议那样执行在底层。CIFS能够看做是应用程序协议如文件传输协议和超文本传输协议的一个实现。

(转载的,人家也是转载的,没标明出处╮(╯▽╰)╭)。


以下还是来擅长的代码吧.

第一步:搞清楚你全部读取的共享文件的文件夹结构及IP地址,假设须要用户权限的话,那么你就要知道username和password是多少。

例1:smb://userName:password@ip/filePath(这样的情况是须要usernamepassword的情况下输入的条件)

例2:smb://ip/filePath(这样的情况是不须要username和password的)

注意:需不须要usernamepassword这是必须要知道的,不然无法读取,能够自己測试一下。(ctrl+r 输入://192.168.0.12 回车。假设须要账户名password的话,会弹出一个对话框的)

第二步:提供本地保存文件的地址文件夹;

例:E://12 (文件夹必须事先创建好,或者在程序中创建)


接下来上代码:

//获取client全部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是共享机器的usernamepassword
     * @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/下载;

posted @ 2018-04-04 13:24  llguanli  阅读(387)  评论(0编辑  收藏  举报