Java 写入文件到 Windows 共享文件夹中的文件(WIN11)

目录

摘要

设置共享文件夹

是否设置密码

测试


摘要

使用Java通过JCIFS框架读写共享文件夹,使用SMB协议,并支持域认证。

项目常常需要有访问共享文件夹的需求,例如读取共享文件夹存储的视频、照片和PPT等文件。那么如何使用Java读写Windows共享文件夹呢?

使用Java访问拥有全部读写权限的共享文件夹比较简单,和普通的目录没有什么区别。但是,如果从Linux服务器访问一个windows服务器上需要用户名和密码验证的共享文件夹,就需要一点点小技巧了。这里介绍一个开源的库JCIFS,他可以轻松满足此需求。

JCIFS是使用Java语言开发的一款开源框架,通过SMB协议访问远程共享文件夹,就像访问本地文件夹一样,简简单单。她同时支持Windows和Linux共享文件夹,不过,Linux共享文件夹需要安装Samba服务软件(官网:http://www.samba.org/)。

另外,通过挂载该共享文件夹到Linux服务器下也可以实现,此时不需要借助SMB协议,对此,这里不做介绍。

设置共享文件夹

设置共享文件夹(这里我们选择有密码的方式进行共享)
创建一个文件夹;
文件夹「右键属性」点击共享;
选中的 “everyone” 选项,点击添加;
设置级别权限,最后点击最下方的共享;
文件夹右键属性,选择高级共享,点击权限,设置权限为完全控制,然后确定;

共享文件电脑创建 smb 协议

是否设置密码

根据自己的需求,取选择「有密码保护的共享」或「无密码保护的共享」

打开win11 网络和Internet进行设置

添加一个测试用户

win11添加其他用户跳过邮箱登录

测试

「按 win + r 键」

测试命令:

\\10.106.138.27\test

代码示例

<!-- jcifs 共享文件夹目录 -->
<dependency>
  <groupId>org.samba.jcifs</groupId>
  <artifactId>jcifs</artifactId>
  <version>1.3.3</version>
</dependency>

package io.github.rovingsea.glancecorrection.sample.utils;

import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

import java.io.*;
import java.nio.file.Files;
import java.util.Objects;

public class SmbFileUtils {

    public static void main(String[] args) {
        getRemoteFile();
    }

    public static void getRemoteFile() {
        // 创建远程文件对象
        // smb://ip地址/共享的路径/...
        // smb://用户名:密码@ip地址/共享的路径/...
        String remoteUrl = "smb://test1:test1@10.106.xxx.27/test/";

        smbTransferFile(remoteUrl, "D:\\exp_2023_05_25_14_11_13.log");

        SmbFile[] smbFiles = smbGetFiles(remoteUrl);
        if (Objects.nonNull(smbFiles)) {
            for (SmbFile smbFile : smbFiles) {
                System.out.println("smbFile路径:" + smbFile.getUncPath());
            }
        }

    }

    /**
     * @return
     * @Description 从共享目录读取文件
     * @Param shareDirectory 共享目录
     */
    private static SmbFile[] smbGetFiles(String remoteUrl) {
        try {
            SmbFile remoteFile = new SmbFile(remoteUrl);
            remoteFile.connect();//尝试连接
            if (remoteFile.exists()) {
                // 获取共享文件夹中文件列表
                return remoteFile.listFiles();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return null;
    }


    /**
     * @Description 向共享目录上传文件
     * @Param shareDirectory 共享目录
     * @Param localFilePath 本地目录中的文件路径
     */
    public static void smbTransferFile(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(Files.newInputStream(localFile.toPath()));
            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 {
                if (Objects.nonNull(out)) {
                    out.close();
                }
                if (Objects.nonNull(in)) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

运行成功以后,我们就把共享文件夹中的文件写入到我们指定的共享文件夹了

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值