jcifs 詳解讀取網絡共享文件數據

時隔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:[email protected]/share/");
for (String fileName : fileNames) {
	File file = Smb.readFromSmb("smb://Administrator:[email protected]/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:[email protected]/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/下載;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章