浅谈SmbFile 远程获取服务器文件

最近碰到一个需求,需要在内网里面访问服务器上面的文件,读取里面的文件信息,并保存到数据库中。一开始想到的是用URL读取到文件流,以下为URL地址转为文件流的方法:

public static InputStream getUrlInputStream(String urlAddress) {
	try {
		URL url = new URL(urlAddress);
		URLConnection urlConnection = url.openConnection();
		return urlConnection.getInputStream();
	} catch (MalformedURLException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	return null;
}

然后将文件下载到本地,再通过读取本地文件的形式来进行处理。但是要是服务器上面不支持Http的协议,那上面的方法就不能用了。在经过查找资料以后,我采用了SmbFile类来实现了上面的问题,具体的使用方法介绍如下。

1、在使用SmbFile的时候,需要共享服务器上面的文件所在文件夹(怎么共享文件夹请问度娘,不同的服务器共享方式不同),这里提醒一下,父文件夹共享就可以了,比如你的文件在D:/11/22/1.csv,你把D:/11/文件夹共享了,22文件夹自然也是可以访问到的,也就是说你要访问1.csv文件,你共享了D:/11/22/和共享D:/11/都是可以的。

2、导入jar包,我用的是jcifs-1.3.17.jar

3、使用SmbFile来远程获取服务器上面的文件了,下面是将远程文件下载到本地的方法

/**
* 获取远程文件
* @param remoteUsername 远程目录访问用户名
* @param remotePassword 远程目录访问密码
* @param remoteFilepath 远程文件地址,该参数需以IP打头,如'192.168.8.2/aa/bb.java'或者'192.168.8.2/aa/',如'192.168.8.2/aa'是不对的
* @param localDirectory 本地存储目录,该参数需以'/'结尾,如'D:/'或者'D:/mylocal/'
* @return boolean 是否获取成功
* @throws Exception
*/
public static boolean getRemoteFile(String remoteUsername, String remotePassword, String remoteFilepath,
	        String localDirectory) throws Exception {
		boolean isSuccess = Boolean.FALSE;
		if (remoteFilepath.startsWith("/") || remoteFilepath.startsWith("\\")) {
			return isSuccess;
		}
		if (!(localDirectory.endsWith("/") || localDirectory.endsWith("\\"))) {
			return isSuccess;
		}
		SmbFile smbFile = null;
		if (StringUtils.isNotEmpty(remoteUsername) && StringUtils.isNotEmpty(remotePassword)) {
			smbFile = new SmbFile("smb://" + remoteUsername + ":" + remotePassword + "@" + remoteFilepath);
			logger.debug("smb://" + remoteUsername + ":" + remotePassword + "@" + remoteFilepath);
		} else {
			smbFile = new SmbFile("smb://" + remoteFilepath);
			logger.debug("smb://" + remoteFilepath);
		}
		
		if (smbFile != null) {
			if (smbFile.isDirectory()) {
				for (SmbFile file : smbFile.listFiles()) {
					isSuccess = copyRemoteFile(file, localDirectory);
				}
			} else if (smbFile.isFile()) {
				isSuccess = copyRemoteFile(smbFile, localDirectory);
			}
		}
		
		return isSuccess;
}
/**
* 拷贝远程文件到本地目录
* @param smbFile 远程SmbFile
* @param localDirectory 本地存储目录,本地目录不存在时会自动创建,本地目录存在时可自行选择是否清空该目录下的文件,默认为不清空
* @return boolean 是否拷贝成功
*/
public static boolean copyRemoteFile(SmbFile smbFile, String localDirectory) {
		SmbFileInputStream in = null;
		FileOutputStream out = null;
		try {
			File[] localFiles = new File(localDirectory).listFiles();
			if (null == localFiles) {
				// 目录不存在的话,就创建目录
				new File(localDirectory).mkdirs();
			}
			in = new SmbFileInputStream(smbFile);
			out = new FileOutputStream(localDirectory + smbFile.getName());
			byte[] buffer = new byte[1024];
			int len = -1;
			while ((len = in.read(buffer)) != -1) {
				out.write(buffer, 0, len);
			}
			out.flush();
		} catch (Exception e) {
			logger.error("拷贝远程文件到本地目录失败", e);
			return false;
		} finally {
			if (null != out) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != in) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return true;
}

注意:SmbFile访问远程文件有两种方法,一种是带用户名密码的,一种是不带的,声明的方式不一样

最后加一个读取csv文件的简单方法,导入javacsv-2.1.jar包

// 创建CSV读对象
CsvReader csvReader = new CsvReader(localFileName);
// 读表头
csvReader.readHeaders();
// 读取一行内容
String info = csvReader.getRawRecord();

以上就是使用SmbFile访问远程服务器上文件,并下载到本地的方法。



你可能感兴趣的:(文件处理,Java)