如何使用Java代码读写windows共享文件夹呢?
下文笔者讲述使用java代码读写windows共享文件夹的方法分享,如下所示
java代码访问共享文件夹的示例
Java读写windows共享文件夹的实现思路
借助JCIFS框架读写共享文件夹
(使用SMB协议
此方式支持域认证)
JCIFS简介
JCIFS是
使用Java语言开发的一款开源框架
通过SMB协议访问远程共享文件夹
就像访问本地文件夹一样
JCIFS同时支持Windows和Linux共享文件夹
注意事项:
Linux共享文件夹需要安装Samba服务软件(官网:http://www.samba.org/)
例:java代码访问共享文件夹的示例
1.引入依赖
<!-- https://mvnrepository.com/artifact/org.samba.jcifs/jcifs -->
<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.3</version>
</dependency>
//2.编写相应的代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;
public class SmbFileUtil {
private static Logger log = LoggerFactory.getLogger(SmbFileUtil.class);
private static String USER_DOMAIN = "yourDomain";
private static String USER_ACCOUNT = "yourAccount";
private static String USER_PWS = "yourPassword";
public static void main(String[] args) throws Exception {
// remoteUrl 格式示例 【smb://8.8.8.8/CIMPublicTest/】
// 目录
String shareDir = "smb://8.8.8.8/CIMPublicTest/";
listFiles(shareDir);
}
/**
* @Title listFiles
* @Description 遍历指定目录下的文件
*/
private static void listFiles(String shareDirectory) throws Exception {
long startTime = System.currentTimeMillis();
// 域服务器验证
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(USER_DOMAIN, USER_ACCOUNT,
USER_PWS);
SmbFile remoteFile = new SmbFile(shareDirectory, auth);
log.info("远程共享目录访问耗时:【{}】", System.currentTimeMillis() - startTime);
if (remotefile.exists()) {
SmbFile[] files = remoteFile.listFiles();
remoteFile.listFiles(shareDirectory);
for (SmbFile f : files) {
log.info(f.getName());
}
} else {
log.info("文件不存在");
}
}
}
/*
NtlmPasswordAuthentication类用于域认证
需要三个参数
第一个是域名,如果没有,就赋值null,
第二个是用户名
第三个是密码
*/
/**
* @Title smbGet
* @Param shareUrl 共享目录中的文件路径,如smb://8.8.8.8/CIMPublicTest/eg.txt
* @Param localDirectory 本地目录,如tempStore/smb
*/
public static void smbGet(String shareUrl, String localDirectory) throws Exception {
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(USER_DOMAIN, USER_ACCOUNT,
USER_PWS);
SmbFile remoteFile = new SmbFile(shareUrl, auth);
if (!remoteFile.exists()) {
log.info("共享文件不存在");
return;
}
// 有文件的时候再初始化输入输出流
InputStream in = null;
OutputStream out = null;
log.info("下载共享目录的文件 shareUrl 到 localDirectory");
try {
String fileName = remoteFile.getName();
File localFile = new File(localDirectory + File.separator + fileName);
File fileParent = localFile.getParentFile();
if (null != fileParent && !fileParent.exists()) {
fileParent.mkdirs();
}
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
out.flush(); //刷新缓冲区输出流
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
in.close();
}
}
/**
*
* @Title smbPut
* @Description 向共享目录上传文件
* @Param shareDirectory 共享目录
* @Param localFilePath 本地目录中的文件路径
*/
public static void smbPut(String shareDirectory, String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(shareDirectory + "/" + fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


