java中的路径处理、左右斜杠

文章目录

      • [PathNormalizer 工具类](#PathNormalizer 工具类)

属于基础问题,也整理下。

典型场景:

获取文件路径,拿到的是 d:\data\upload 然后代码中拼接的是/,这样存到库里乱七八糟。

PathNormalizer 工具类

java 复制代码
import java.nio.file.Path;
import java.nio.file.Paths;

public class PathNormalizer {
    
    /**
     * 统一路径分隔符为正斜杠(推荐用于存储和显示)
     */
    public static String normalizeToUnix(String path) {
        if (path == null || path.isEmpty()) {
            return path;
        }
        // 统一替换反斜杠为正斜杠
        return path.replace('\\', '/')
                   .replaceAll("/+", "/"); // 合并多个斜杠
    }
    
    /**
     * 统一为系统默认分隔符(用于文件系统操作)
     */
    public static String normalizeToSystem(String path) {
        if (path == null || path.isEmpty()) {
            return path;
        }
        // 先统一为正斜杠,再转为系统分隔符
        String normalized = normalizeToUnix(path);
        return normalized.replace('/', File.separatorChar);
    }
    
    /**
     * 安全拼接路径(所有输入先归一化)
     */
    public static String join(String base, String... parts) {
        if (base == null) {
            return null;
        }
        
        // 归一化基础路径
        String normalized = normalizeToUnix(base);
        
        // 去除末尾斜杠
        if (normalized.endsWith("/")) {
            normalized = normalized.substring(0, normalized.length() - 1);
        }
        
        // 拼接每个部分
        for (String part : parts) {
            if (part == null || part.isEmpty()) {
                continue;
            }
            // 归一化当前部分
            String normalizedPart = normalizeToUnix(part);
            // 去除开头斜杠
            if (normalizedPart.startsWith("/")) {
                normalizedPart = normalizedPart.substring(1);
            }
            normalized += "/" + normalizedPart;
        }
        
        return normalized;
    }
    
    /**
     * 转换为 Path 对象(自动处理系统分隔符)
     */
    public static Path toPath(String path) {
        if (path == null) {
            return null;
        }
        return Paths.get(normalizeToUnix(path));
    }
}
相关推荐
用户312687487720几秒前
ReentrantLock 和 synchronized 到底选哪个?源码级对比与选型
java
计算机毕设定制辅导-无忧学长3 分钟前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
码路漫漫4 分钟前
LRU 真的能解决日志按业务 Key 分文件的落地瓶颈吗?
java·后端
2601_962293798 分钟前
【Python教程:自动化处理文件】
python·自动化·编程·文件处理·os模块
禹凕8 分钟前
快速幂算法详解与实战
python·算法
sylviiiiiia18 分钟前
leetcode hot 100
python·算法·leetcode
带刺的坐椅24 分钟前
不只是 Token 流:Solon AI 4.1 的语义化聊天事件
java·stream·event·solon-ai
半摆烂日常27 分钟前
自建WMS和买成品:三年成本对比
大数据·服务器·数据库·python·深度学习·低代码·numpy
延凡科技30 分钟前
建筑节能新视角:智慧冷站的数字化实践
java·人工智能·能源·暖通
励志不掉头发的内向程序员33 分钟前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互