smb协议共享文件


SMB协议


    SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。服务器信息块(SMB)协议是一种IBM协



议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。  SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(named pipe)等资源。  在 TCP/IP 环境下,客户机通过 NetBIOS over TCP/IP(或 NetBEUI/TCP 或 SPX/IPX)连接服务器。一旦连接成功,客户机可发送 SMB 命令到服务器上,从而客户机能够访问共享目录、打开文件、读写文件,以及一切在文件系统上能做的所有事情。  从 Windows 95 开始,Microsoft Windows 操作系统(operating system)都包括了客户机和服务器 SMB 协议支持。Microsoft 为 Internet 提供了 SMB 的开源版本,即通用 Internet 文件系统 (CIFS)。与现有 Internet 应用程序如文件传输协议(FTP)相比, CIFS 灵活性更大。对于 UNIX 系统,可使用一种称为 Samba 的共享软件。


package com.wu;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

/**
 * smbFile远程获取共享文件
 * @author t410
 *
 */
public class SmbFileTest {

	/**
	 * jcifs的开发方法类似java的文件操作功能,它的资源url定位:smb://{user}:{password}@{host}/{path},
	* smb为协议名,user和password分别为共享文件机子的登陆名和密码,@后面是要访问的资源的主机名或IP地址。最后是资源的共享文件夹名称和共享资源名。
	* 例如smb://abc_data:123456@172.19.32.211/abc/hottopic/website/160620130107_004_886.txt。
	*
	* 在JAVA程序中,使用如下方式获得一个远程共享文件(设置共享文件的权限——读取、修改、完全控制)的句柄:SmbFile file = newSmbFile("smb://abc_data:123456@172.19.32.211/abc/hottopic/website/160620130107_004_886.txt");
	* 这里的句柄不仅限于远程的共享文件,还可能是共享文件夹。
	* isFile()方法和isDirectory()用来判断这个句柄对应的资源的真实属性。如果是共享文件夹
	* ,通过调用它的list()方法将获得其中资源的列表。
	* List方法支持过滤器机制,有两种过滤器可供使用,一种是SmbFileFilter,另一种是SmbFilenameFilter
	* ,这两个在jcifs中作为接口出现,你可以根据自己的需要派生出个性化的过滤器,实现接口中的accept方法,以满足不同业务的需求。
	*   
	* SmbFileInputStream是smb文件的输入流,它的功能是以流的方式打开一个SmbFile:SmbFileInputStream
	* in = new SmbFileInputStream(file);SmbFileInputStream提供read方法,你可以从这个流中读出远程文件全部的内容。
	*
	 * @param args
	 */
	public static void main(String[] args) {
		String smbUrlRead="smb://abc_data:123456@172.19.32.211/abc/hottopic/website/160620130107_004_886.txt";
		String smbUrlWwrite="smb://abc_data:123456@172.19.32.211/abc/hottopic/website/test.txt";
		try {
			smbGetFile(smbUrlRead);//远程获取数据
			smbSetFile(smbUrlWwrite);//共享文件上传
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	//共享文件,从服务器上获取文件
	 public static void smbGetFile(String smbUrlRead) throws IOException {  
	        SmbFile smbFile = new SmbFile(smbUrlRead);  
	        InputStream in=null;
	        String line = ""; 
	        if (smbFile.exists() && smbFile.isFile()) {//判断是否为文件
				in = smbFile.getInputStream();
				BufferedReader bf = new BufferedReader(new InputStreamReader(in,
						"UTF-8"));
				while ((line = bf.readLine()) != null) {
					System.out.println(line);//读取一行数据
				}
				in.close();
			}
	    }  
	 
	 //向服务器上传文件
	 public static void smbSetFile(String smbUrlWwrite) {
		 try {
			SmbFile smbFile = new SmbFile(smbUrlWwrite);
			BufferedWriter out = null;  
			if(!smbFile.exists()) {//判断文件是否存在,不存在就创建新的文件
				smbFile.createNewFile();
			}
			//写入的文件--这种写入文件是进行了判断,如果文件存在就打开文件在写入即在后面追加,不存在上面那步创建新的文件
			  out = new BufferedWriter(new OutputStreamWriter(new SmbFileOutputStream(smbFile, true)));     
	          out.write("要写入的内容"+"\r\n"); 
	          out.flush();
	          out.close();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (SmbException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}  
	 }
}

共享文件的写入:编码格式的设置:

//判断这是一个文件,不存在就创建
			SmbFileOutputStream out = null;  
			if(!smbTaskMinute.exists()){
				smbTaskMinute.createNewFile();
			}
			//写入的文件
			  out = new SmbFileOutputStream(smbTaskMinute, true);
			  String str="测试";
<span style="white-space:pre">			</span>  str += "\r\n";
	                out.write(str.getBytes("UTF-8"));
	               out.flush();




  • 项目的使用注意的事项
  • 获取获得的smbFile文件的路径的上一级(即父级路径)采用的是smbFile.getParent()
  • 在获取的文件的后面添加一级采用的是新new一个smbFile对象,采用stringBuffer进行拼接一个路径来获取
  • 判断是文件还是文件夹使用smbFile.isFile()来判断是文件,使用smbFile.isDirectory()来判断是文件夹,获取文件夹中的表,当smbFile是文件夹时,使用smbFile.list()来获取文件夹中列表,文件夹不存在的时候,使用smbFile. mkdirs()来创建文件夹,  文件不存在的时候smbFile.createNewFile()来创建新的文件


创建文件
if(!smbFile.exists()) {//判断文件是否存在,不存在就创建新的文件
                smbFile.createNewFile();
            }



创建文件夹
try {
                    if(!smbFile.isDirectory()) {
                        smbFile.mkdirs();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }