使用 jcifs 读取文件的最简单方法
Posted
技术标签:
【中文标题】使用 jcifs 读取文件的最简单方法【英文标题】:Simplest way to read a file using jcifs 【发布时间】:2017-09-15 04:56:48 【问题描述】:我正在尝试使用外部 jcifs library 从网络共享读取文件。我能找到的大多数用于读取文件的示例代码都非常复杂,可能是不必要的。我找到了一种将写入文件的简单方法,如下所示。有没有办法使用类似的语法读取文件?
SmbFile file= null;
try
String url = "smb://"+serverAddress+"/"+sharename+"/TEST.txt";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, username, password);
file = new SmbFile(url, auth);
SmbFileOutputStream out= new SmbFileOutputStream(file);
out.write("test string".getBytes());
out.flush();
out.close();
catch(Exception e)
JOptionPane.showMessageDialog(null, "ERROR: "+e);
【问题讨论】:
你不能以类似的方式使用 SmbFileInputStream 吗? @MarcinPietraszek 可能。如何做到这一点? 【参考方案1】:SmbFile file = null;
byte[] buffer = new byte[1024];
try
String url = "smb://"+serverAddress+"/"+sharename+"/TEST.txt";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, username, password);
file = new SmbFile(url, auth);
try (SmbFileInputStream in = new SmbFileInputStream(file))
int bytesRead = 0;
do
bytesRead = in.read(buffer)
// here you have "bytesRead" in buffer array
while (bytesRead > 0);
catch(Exception e)
JOptionPane.showMessageDialog(null, "ERROR: "+e);
甚至更好,假设您正在处理文本文件 - 使用 Java SDK 中的 BufferedReader
:
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new SmbFileInputStream(file))))
String line = reader.readLine();
while (line != null)
line = reader.readLine();
然后写:
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new SmbFileOutputStream(file))))
String toWrite = "xxxxx";
writer.write(toWrite, 0, toWrite.length());
【讨论】:
哦,缓冲阅读器实现 +1。不知道你能做到这一点 如何使用 bufferedwriter 解决方案写一个新行?目前,如果我循环该方法,则输出到文件是 onetwothreefour。我希望每个元素都单独一行。【参考方案2】: try
String url = "smb://" + serverAddress + "/" + sharename + "/test.txt";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(DOMAIN, USER_NAME, PASSWORD);
String fileContent = IOUtils.toString(new SmbFileInputStream(new SmbFile(url, auth)), StandardCharsets.UTF_8.name());
System.out.println(fileContent);
catch (Exception e)
System.err.println("ERROR: " + e.getMessage());
【讨论】:
【参考方案3】:我可以使用这个来阅读一些 pdf 文件:
private final Singleton<CIFSContext> contextoDdetran = new Singleton<>()
@Override
public CIFSContext inicializar()
NtlmPasswordAuthenticator autenticador = new NtlmPasswordAuthenticator(smbDomain, smbUser, smbPassword);
return SingletonContext.getInstance().withCredentials(autenticador);
;
public byte[] readSmbFile(String fileName)
try
SmbFile file = new SmbFile(fileName, this.contextoDdetran.get());
return file.getInputStream().readAllBytes();
catch(Exception e)
final String msgErro = String.format("Error reading file '%s': %s", fileName, e.getMessage());
logger.error(msgErro, e);
throw new IllegalStateException(msgErro);
【讨论】:
以上是关于使用 jcifs 读取文件的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章
jcifs.smb.SmbAuthException:登录失败:未知用户名或密码错误。
spring-boot项目直接读取jar包内文件的最简单方法