SMB协议的共享文件读写

java 通过 SmbFile 类操作共享文件夹(1) 四、上传文件 /** 上传文件 @param remoteUrl @param shareFolderPath @param localFilePath @param fileName */ public static void uploadFileToSharedFolder(String remoteUrl, String shareFolderPath, String localFilePath, String fileName) { InputStream inputStr 阅读详情

背景介绍

一、SMB协议

SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。
服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。
  SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(named pipe)等资源。
  在 TCP/IP 环境下,客户机通过 NetBIOS over TCP/IP(或 NetBEUI/TCP 或 SPX/IPX)连接服务器。一旦连接成功,客户机可发送 SMB 命令到服务器上,从而客户机能够访问共享目录、打开文件、读写文件,以及一切在文件系统上能做的所有事情。
  从 Windows 95 开始,Microsoft Windows 操作系统(operating system)都包括了客户机和服务器 SMB 协议支持。Microsoft 为 Internet 提供了 SMB 的开源版本,即通用 Internet 文件系统 (CIFS)。与现有 Internet 应用程序如文件传输协议(FTP)相比, CIFS 灵活性更大。对于 UNIX 系统,可使用一种称为 Samba 的共享软件

二、CIFS(Common Internet File System) 协议

CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机的服务。CIFS 使用客户/服务器模式。客户程序请求远在服务器上的服务器程序为它提供服务。服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB协议现在是局域网上用于服务器文件访问和打印的协议。象SMB协议一样,CIFS在高层运行,而不象TCP/IP协议那样运行在底层。CIFS可以看做是应用程序协议如文件传输协议和超文本传输协议的一个实现。

三、NETBios协议

Netbios (网络基本输入/输出系统)最初由 IBM,Sytek 作为API开发,使用户软件能使用局域网的资源。自从诞生,Netbios成为许多其他网络应用程序的基础。严格意义上,Netbios 是接入网络服务的接口标准。
  Netbios 原来是作为THE网络控制器为 IBM 局域网设计的,是通过特定硬件用来和网络操作系统 连接的软件层。Netbios经扩展,允许程序使用Netbios接口来操作IBM令牌环结构。Netbios 已被公认为工业标准,通常参照 Netbios-compatible LANs。
  它提供给网络程序一套方法,相互通讯及传输数据。基本上,Netbios 允许程序和网络会话。它的目的是把程序和任何类型的硬件属性分开。它也使软件开发员可以免除以下负担:开发网络错误修复,低层信息寻址和路由。使用Netbios接口,可以为软件开发员做许多工作。
  Netbios使程序和局域网操作能力之间的接口标准化。有它们可以将程序细化到为OSI模型的哪一层所写,使程序能移植到其他网络上。在Netbios局域网环境下,计算机通过名字被系统知道。网络中每台计算机都有通过不同方法编的永久性名称。这些名称将在下面做进一步讨论。
  通过使用Netbios的数据报或广播方式,在Netbios局域网上的pc机建立会话彼此联络。会话允许更多的信息被传送,探测错误,和纠正。通信是在一对一的基础上的。数据报或广播方式允许一台计算机和多台其他的计算机同时通信,但信息大小受限。使用数据报或广播方式没有探测错误和纠正。然而,数据报通信可以不必建立一个会话。
  在这种环境下所有的通信以一种称为“网络控制块“的格式提交给NetBIOS。内存中这些块的分配依赖于用户程序。这些“网络控制块“分配到域中,分别为输入/输出保留。
  在当今的环境中,NetBIOS是使用很普遍的协议。以太网,令牌环,IBM PC网都支持NetBIOS。在它原始版本中,它仅作为程序和网络适配器的接口。从那以后,传输类功能加入NetBIOS,使它功能日益增多。
  在NetBIOS里,面向连接(tcp)和无连接(udp)通信均支持。它支持广播和复播,支持三个分开的服务:命名,会话,数据报。

操作 

一、添加依赖

去maven Repository找对应的版本

<dependency>
       <groupId>jcifs</groupId>
       <artifactId>jcifs</artifactId>
       <version>1.3.17</version>
</dependency>

二、读取文件

/**
  * 读取共享文件夹下的所有文件(文件夹)的名称
  * @param remoteUrl
  */
public static void getSharedFileList(String remoteUrl) {
    SmbFile smbFile;
    try {
        // smb://userName:passWord@host/path/
        smbFile = new SmbFile(remoteUrl);
        if (!smbFile.exists()) {
            System.out.println("no such folder");
        } else {
            SmbFile[] files = smbFile.listFiles();
            for (SmbFile f : files) {
                System.out.println(f.getName());
            }
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (SmbException e) {
        e.printStackTrace();
    }
}

三、创建文件夹

/**
 * 创建文件夹
 * @param remoteUrl 
 * @param folderName
 * @return
 */
public static void smbMkDir(String remoteUrl, String folderName) {
    SmbFile smbFile;
    try {
        // smb://userName:passWord@host/path/folderName
        smbFile = new SmbFile(remoteUrl + folderName);
        if (!smbFile.exists()) {
            smbFile.mkdir();
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (SmbException e) {
        e.printStackTrace();
    }
}

四、上传文件

/**
  * 上传文件
  * @param remoteUrl
  * @param shareFolderPath
  * @param localFilePath
  * @param fileName
  */
public static void uploadFileToSharedFolder(String remoteUrl, String shareFolderPath, String localFilePath, String fileName) {
    InputStream inputStream = null;
    OutputStream outputStream = null;
    try {
        File localFile = new File(localFilePath);
        inputStream = new FileInputStream(localFile);
        // smb://userName:passWord@host/path/shareFolderPath/fileName
        SmbFile smbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
        smbFile.connect();
        outputStream = new SmbFileOutputStream(smbFile);
        byte[] buffer = new byte[4096];
        int len = 0; // 读取长度
        while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        // 刷新缓冲的输出流
        outputStream.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

五、下载文件

/**
  * 下载文件到浏览器
  * @param httpServletResponse
  * @param remoteUrl
  * @param shareFolderPath
  * @param fileName
  */
public static void downloadFileToBrowser(HttpServletResponse httpServletResponse, String remoteUrl, String shareFolderPath, String fileName) {
    SmbFile smbFile;
    SmbFileInputStream smbFileInputStream = null;
    OutputStream outputStream = null;
    try {
        // smb://userName:passWord@host/path/shareFolderPath/fileName
        smbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
        smbFileInputStream = new SmbFileInputStream(smbFile);
        httpServletResponse.setHeader("content-type", "application/octet-stream");
        httpServletResponse.setContentType("application/vnd.ms-excel;charset=UTF-8");
        httpServletResponse.setHeader("Content-disposition", "attachment; filename=" + fileName);
        // 处理空格转为加号的问题
        httpServletResponse.setHeader("Content-Disposition", "attachment; fileName=" + fileName + ";filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"));
        outputStream = httpServletResponse.getOutputStream();
        byte[] buff = new byte[2048];
        int len;
        while ((len = smbFileInputStream.read(buff)) != -1) {
            outputStream.write(buff, 0, len);
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (SmbException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        try {
            outputStream.close();
            smbFileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
  * 下载文件到指定文件夹
  * @param remoteUrl
  * @param shareFolderPath
  * @param fileName
  * @param localDir
  */
public static void downloadFileToFolder(String remoteUrl, String shareFolderPath, String fileName, String localDir) {
    InputStream in = null;
    OutputStream out = null;
    try {
        SmbFile remoteFile = new SmbFile(remoteUrl + shareFolderPath + File.separator + fileName);
        File localFile = new File(localDir + File.separator + fileName);
        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];
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            out.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

六、删除文件

/**
  * 删除文件
  * @param remoteUrl
  * @param shareFolderPath
  * @param fileName
  */
public static void deleteFile(String remoteUrl, String shareFolderPath, String fileName) {
    SmbFile SmbFile;
    try {
        // smb://userName:passWord@host/path/shareFolderPath/fileName
        SmbFile = new SmbFile(remoteUrl + shareFolderPath + "/" + fileName);
        if (SmbFile.exists()) {
            SmbFile.delete();
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (SmbException e) {
    e.printStackTrace();
    }
}


/**
  * 删除文件夹
  * @param remoteUrl
  * @param shareFolderPath
  */
public static void deleteFile(String remoteUrl, String shareFolderPath) {
    SmbFile SmbFile;
    try {
        // smb://userName:passWord@host/path/shareFolderPath
        SmbFile = new SmbFile(remoteUrl + shareFolderPath);
        if (SmbFile.exists()) {
            SmbFile.delete();
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (SmbException e) {
    e.printStackTrace();
    }
}

 

samba数据源类似file的调用---SmbFile 最近开发过程中,做samba和web服务器对接的时候发现了神器SmbFile,应该很多熟悉的就是smbclient这个命令了,那么SmbFile又是一个什么东东。 起源是这样的,老板叫我对samba的数据源进行读取,几千万条数据啊,难道我用java构造个shell环境用smbclient一个一个遍历?oh,no不敢想象,此时如果有个像File一样的对象,那么简直是雪中送炭,只要你敢想,它就可能出现... 阅读详情

相关推荐

Java项目实战:用jcifs-ng搞定Windows共享文件读写(SMB2协议兼容版)

本文详细介绍了如何使用jcifs-ng库在Java项目中实现Windows共享文件的高效读写,特别针对SMB2/3协议兼容性问题提供解决方案。从环境配置、认证管理到文件操作实战,涵盖大文件传输优化和性能调优技巧,助力企业级应用开发提升跨平台文件共享效率。

weixin_30555125的博客 212

基于SMB协议的共享文件读写

一、SMB协议  SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。  服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。    SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、

zhuzj12345的博客 2033

samba 服务

(2)配置 linux3 为 samba 服务器,建立共享目录/srv/sharesmb,共享名与目录名相同。用户对自己新建的文件有完全权限,对其他用户的文件只有读权限,且不能删除别人的文件。user00 和user01 添加到 manager 组,user02 和 user03 添加到 dev 组。把用户user00-user03 添加到 samba 用户。(3)在 linux4 修改/etc/fstab,使用用户 user00 实现自动挂载linux3 的 sharesmb 共到/sharesmb。

weixin_46396917的博客 401

SMB操作远程文件

SMB远程操作文件 下载远程文件,逐行修改符合条件的行内容,将修改完的文件重新上传到指定远程目录下 主要注意访问的url格式为: smb://账号user:密码password@访问的ip/要访问的文件路径/文件.txt package com.jidian.mdcs.util; import jcifs.smb.SmbFile; import jcifs.smb.SmbFileInputStream; import jcifs.smb.SmbFileOutputStream; import lom

weixin_44181671的博客 2790

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 613

AI训练师团队管理运营思路

工具运营AI训练师主要是支撑运营,协助算法和运营提高托管机器人的解决能力,以协助降低业务场景熔断与优化场景识别为核心运营目标,通过算法聚类、标注分析等方式,结合业务知识,提供精准、清晰的标注数据和解决方案,确保训练效果满足需求。过程中需要与算法、运营一块参与模型搭建和数据验收,并且负责核心指标和数据日常的跟踪维护。④针对知识库已有意图进行梳理和分析,反馈运营评估缺失或合并意图优化方向。③对语料数据进行挖掘、清洗,解除缠绕、冗余等问题导致的未识别。①线上case分析,及时发现识别问题导致的托管熔断问题。

qq_25438419的博客 1085

java通过SMB协议读写共享文件

前段时间做的一个项目有用到SMB协议的,通过局域网访问共享文件夹,关于SMB协议网上很多讲解,这里我不做过多解释,我只要讲下我在使用SMB协议访问远程服务器共享文件的时候的一些经验: smb访问的基本格式:smb:域名;用户名:密码@目的IP/文件夹/文件名.xxx 注意:如果密码中有像“@”这种特殊字符的情况,就要通过 NtlmPasswordAuthentication a...

海阔天空的博客 1万+

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 882

smb协议只能在同一网段吗_基于SMB协议的共享文件读写 博客分类: Java

一、SMB协议SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及...

weixin_32821533的博客 2539

Paypal开发者中心获取“ClientId”和“ClientSecret”参数

正式环境设置 1、登录到 paypal开发者中心 网址:https://developer.paypal.com/developer/ 点击右上角登录按钮登录 2、左侧栏 - 我的应用程序和凭证 - 点击“创建新应用” 新注册的paypal账号,需要进行邮箱验证,验证通过后,需要等待一段时间(或重新登录),才会出现相关设置项位置 验证邮箱通过后,点击创建新应用 3、按提示填写,保存创建应用 4、点击刚创建的应用进入应用详情页 5、应用详情页获得网站开发人员所需要的“ClientId”和“Client

龚清林的博客 1万+

Halcon 3D点云处理实战:从PLY文件读取到曲面匹配的完整流程(附避坑指南)

本文详细介绍了Halcon在3D点云处理中的完整流程,从PLY文件读取到曲面匹配,特别强调了3D算子的应用技巧和避坑指南。通过实战案例和参数优化建议,帮助开发者高效处理工业视觉检测中的复杂点云数据,提升匹配精度和性能。

weixin_42535720的博客 278

基于SMB协议的共享文件读写 博客分类: Java

基于SMB协议的共享文件读写 博客分类: Java   一、SMB协议 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。 服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。   SMB 一种客户机/服务器、请求/...

weixin_33778544的博客 247

知识库构建革命:基于Agent的智能检索系统设计

本文聚焦“基于Agent的智能检索系统”这一前沿技术,系统讲解其设计逻辑、核心技术与落地方法。我们将覆盖从基础概念(如Agent如何“理解”知识)到实战代码(如何用Python搭建原型系统)的全链路内容,帮助技术开发者、企业知识管理负责人理解这一技术为何能颠覆传统知识库。本文将按“问题引入→核心概念→技术原理→实战落地→未来趋势”的逻辑展开:先用“老图书馆的困境”故事引出传统知识库的问题;再用“智能图书管理员”类比解释Agent如何革新检索;接着拆解NLP、对话管理、知识推理等核心技术;

AI智能探索者的博客 728

超详细:Java 读取 Windows 共享文件夹中的文件,并下载到本地电脑中

JCIFS 是使用纯 Java 开发的一个开源框架,通过 smb 协议访问远程文件夹。该框架同时支持 Windows 共享文件夹和 Linux 共享文件夹,不过,Linux 共享文件夹需要安装 Samba 服务软件。(官网:http://www.samba.org/)。

SuZhan0711 9519

深入Netflix影片分类数据抓取的Python爬虫实战:反反爬机制绕过与Playwright应用全解析

技术工具用途Playwright控制真实浏览器模拟用户行为开发语言asyncio异步调度浏览器任务pandas数据处理和导出sqlite3本地数据库存储支持随机UA模拟,增强反爬能力为什么选择 Playwright?✅ 支持多浏览器(Chromium、Firefox、WebKit)✅ 原生支持 Python 异步编程✅ 提供截图、滚动模拟、验证码处理等高级功能✅ 反爬能力强,模拟真实用户访问。

2201_76125261的博客 1239

第44节:cesium 大雾效果(cesium自带)(含源码+视频)

cesium 大雾效果(cesium自带)

qq_29384639的博客 1702

java smb不用密码_Java中SMB的应用

SMB 服务操作Ⅰ SMB简介​ SMB(全称是Server Message Block)是一个协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。SMB协议作为一种局域网文件共享传输协议,常被用来作为共享文件安全传输研究的平台。​ Windows操作系统都包括了客户机和服务器 SMB协议支持。Microsoft 为 Internet 提供了SMB的开源版本,即通用Internet文件系统...

weixin_34152044的博客 710

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

在Java程序中读写windows共享文件夹

摘要使用Java通过JCIFS框架读写共享文件夹,使用SMB协议,并支持域认证。 项目常常需要有访问共享文件夹的需求,例如读取共享文件夹存储的视频、照片和PPT等文件。那么如何使用Java读写Windows共享文件夹呢? 使用Java访问拥有全部读写权限的共享文件夹比较简单,和普通的目录没有什么区别。但是,如果从Linux服务器访问一个windows服务器上需要用户名和密码验证的共享文件夹,就...

专研技术结交志同道合的朋友 72

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【学习笔记】Ubuntu与Windows系统实现共享文件夹

本文基本思路是在Windows系统下设置共享文件夹,然后在Ubuntu系统中通过 CIFS/SMB 协议‌挂载网络共享文件夹,最终实现Ubuntu和Win系统共享文件夹的操作。24.04.2win11家庭中文版如何查看自己的系统版本号呢?Ubuntu:Win:查看Ubuntu操作系统的详细信息弹窗显示Windows版本及内部版本号winver。

hitplayer的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 微信小程序:自定义button分享
下一篇: Java文件类操作【工具类】
Janson_Lin
博客等级 码龄10年 229粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值