使用 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包内文件的最简单方法

从 C++ 调用 Java 方法的最简单方法是啥?

[Android] Android读取Asset下文件的最简单的方法总结(用于MediaPlayer中)

在 .NET 中从 URL 读取到字符串的最简单方法

在 C 中读取和打印 .txt 文件行的最清晰方法