首页 > 编程语言 >Java中使用jcifs库操作SMB协议进行文件操作

Java中使用jcifs库操作SMB协议进行文件操作

时间:2024-10-11 10:13:01浏览次数:6  
标签:文件 jcifs Java String new import SMB

简介
SMB是一种网络通信协议,用于计算机在网络上进行文件共享、打印服务以及其他资源的共享。jcifs是一个纯Java实现的SMB客户端库,它允许Java应用程序访问SMB共享资源。

环境准备
在开始之前,确保你的项目中已经添加了jcifs库的依赖。如果使用Maven,可以在pom.xml文件中添加以下依赖:

xml
<dependency>
    <groupId>jcifs</groupId>
    <artifactId>jcifs</artifactId>
    <version>1.3.19</version>
</dependency>

示例代码
下面是一个使用jcifs库从SMB服务器读取文件并获取其二进制数据的示例代码:

java

package com.csot.kms.common.poi;

import cn.hutool.core.img.ImgUtil;
import com.csot.kms.common.valid.MyException;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

@Slf4j
public class MyJcifsUtil {

    /**
     * 读取文件,获取二进制数据
     *
     * @param filePath 文件路径
     * @param fileName 文件名
     * @return 文件的二进制数据
     */
    public static byte[] smbGetFileByte(String filePath, String fileName) {
        String username = "888";
        String password = "888";
        String server = "888.com";
        String fileUrl = "smb://" + username + ":" + password + "@" + server + "/" + filePath + "/" + fileName;

        log.info("=================文件地址:{}", fileUrl);
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);
        try {
            SmbFile smbFile = new SmbFile(fileUrl, auth);
            smbFile.connect();
            if (smbFile.exists()) {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                byte[] buffer = new byte[4096];
                int bytesRead;
                InputStream inputStream = smbFile.getInputStream();
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                byte[] fileData = outputStream.toByteArray();
                return fileData;
            } else {
                throw new MyException("文件不存在", fileUrl);
            }

        } catch (MalformedURLException | SmbException e) {
            String msg = "错误原因:" + e.getMessage();
            log.info(msg);
            throw new MyException(msg);
        } catch (IOException e) {
            String msg = "错误原因:" + e.getMessage();
            log.info(msg);
            throw new MyException(msg);
        }
    }

    public static void main(String[] args) throws IOException {
        String imgPath = "D:\\dj\\push.jpg";
        String imgPath2 = "D:\\dj\\Rectangle2.png";
        File imageFile = new File(imgPath);
        BufferedImage image = ImageIO.read(imageFile);
        String jpg = ImgUtil.toBase64(image, ImgUtil.IMAGE_TYPE_JPG);
        log.info("===========:{}", jpg);
    }
}

代码解释
配置SMB连接信息:包括用户名、密码、服务器地址和文件路径。
创建SMB文件URL:使用用户名、密码、服务器地址和文件路径构建SMB文件URL。
创建NtlmPasswordAuthentication对象:用于认证。
创建SmbFile对象并连接:通过SMB URL和认证信息创建SmbFile对象,并连接到SMB服务器。
检查文件是否存在:如果文件存在,读取文件内容到ByteArrayOutputStream中。
读取文件内容:使用InputStream读取文件内容,并将其写入ByteArrayOutputStream。
获取二进制数据:从ByteArrayOutputStream中获取文件的二进制数据。
注意事项
确保SMB服务器地址和文件路径正确。
处理好异常情况,例如文件不存在或网络问题。
在生产环境中,不要将用户名和密码硬编码在代码中,而应使用配置文件或环境变量。

标签:文件,jcifs,Java,String,new,import,SMB
From: https://www.cnblogs.com/dj699/p/18457874

相关文章

  • Java 接口缓存(Redis + 注解)
      为了提升用户体验并优化那些因数据量庞大而导致响应缓慢的统计类接口,我们可以采用以下策略来实现接口数据的缓存机制:实现步骤:引入缓存机制:利用Redis作为缓存存储,因其速度快且支持高并发访问。前端请求处理:在前端请求到达后端之前,通过拦截器(Interceptor)进行处......
  • SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。
    SMB签名是ServerMessageBlock(SMB)协议中的一种安全机制,旨在确保数据的完整性和身份验证。1.什么是SMB签名?SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。它通过对数据进行哈希处理,并附加一个签名,确保接收方能够确认收到的数据没有被篡改。......
  • Java基本数据类型转换
    一、自动类型转换1.基本介绍当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换数据类型按精度(容量)大小进行排序为:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/520b6288a88540b0ace9d2c22b844ca4.pngpublicclass......
  • java的数据类型
    java是一门强语言类型Java的数据类型分为两大类1.基本类型(primitivetype)强制转换类型会有内存溢出或者精度丢失问题,不能对boolean类型进行强制转换不能把对象类型转换位不相干的类型整数int类型拓张二进制0b八进制0十六进制0xfloat存在舍入误差问题,最好完全避免使......
  • Java基础知识——String篇
    一、String1、是什么String是Java中用于表示字符串的类。Java中的字符串是不可变的,也就是说一旦创建,字符串的内容无法更改。2、如何构造(1)无参数构造方法:Stringstr=newString();//创建一个空字符串。(2)从字符数组创建:char[]charArray={'H','e','l','l',......
  • Java的基本程序设计结构
    以上整理来自《Java核心技术卷I》注释数据类型变量与常量运算符字符串输入输出控制流大数数组**一个简单的Java应用程序**访问修饰符:用于控制程序的其他部分对这段代码的访问级别。类名:以大写字母开头源代码的文件名必须与公共类的名字相同,并用.java作为扩展名......
  • Vavr - java函数式编程,分离业务代码与非业务代码神器
    微信公众号:阿俊的学习记录空间小红书:ArnoZhangwordpress:arnozhang1994博客园:arnozhangCSDN:ArnoZhang19941.入门指南使用Vavr的项目至少需要支持Java1.8。该.jar文件可以在MavenCentral获取。1.1.Gradledependencies{compile"io.vavr:vavr:0.10.4"}G......
  • 毕业设计项目-基于JavaWeb技术的在线考试系统设计与实现源码+万字论文
    项目简介基于springboot实现的,主要功能如下:技术栈后端框框:springboot/mybatis前端框架:html/JavaScript/Css/vue/elementui运行环境:JDK1.8/MySQL5.7/idea(可选)/Maven3(可选)/tomcat8+(可选)jdk版本:最好是javajdk1.8,我们在这个平台上运行的,其他版本理论上也可以是否需要mave......
  • eclipse导入文件java环境不适配时怎么办
    比如你在Java8.0环境下写的代码,但是导入另一台Java环境为17的电脑,将会出现如下状况:所以我们需要进行改动首先右键单击导入的包,选择properties然后进行如下操作最后红色的感叹号就成功消失啦~......
  • CAS存在的问题及在Java中的解决方式
    CAS介绍CAS可以保证对共享变量操作的原子性CAS全称CompareAndSwap,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。ReentrantLock内部的AQS和原子类内部都使用了CAS。CAS算法涉及到三个操作数:需要读写的内存值V。进行比较的值A。......