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));
    }
}
相关推荐
无垠的广袤8 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
Yolanda_20229 小时前
在vscode终端中可使用pip,但是cmd终端中找不到命令 pip问题的解决
vscode·python·conda·pip
2301_764441339 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
captain3769 小时前
多线程线程安全问题
java·java-ee
吃好睡好便好9 小时前
MATLAB中图像的读取、写入和显示
开发语言·图像处理·学习·计算机视觉·matlab
dogstarhuang9 小时前
用 Doubao-Seed-Evolving + Python 免费写一个网页正文提取工具(实战教程)
爬虫·python·ai编程
CoderYanger9 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
灵极海9 小时前
LangChain4j RAG 实战完整指南:从入门到踩坑
java·langchain
yaoxin5211239 小时前
476. Java 反射 - 调用方法
java·开发语言
猫头虎10 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作