最近碰到一个需求,需要在内网里面访问服务器上面的文件,读取里面的文件信息,并保存到数据库中。一开始想到的是用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访问远程服务器上文件,并下载到本地的方法。