Here you can find the source of normalizeUnixPath(String path)
public static String normalizeUnixPath(String path)
//package com.java2s; /*/*from w w w. j a va 2 s . c om*/ * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.StringTokenizer; public class Main { private static final char COLON_CHAR = ':'; private static final String UNC_PREFIX = "//"; private static final String SLASH = "/"; private static final char SLASH_CHAR = '/'; private static final char BACKSLASH_CHAR = '\\'; /** ??????????"." */ public static final String CURRENT_DIR = "."; /** ?????????".." */ public static final String UP_LEVEL_DIR = ".."; public static String normalizeUnixPath(String path) { return normalizePath(path, false); } public static String normalizePath(String path) { return normalizePath(path, isWindows()); } private static String normalizePath(String path, boolean isWindows) { if (path == null) { return null; } path = path.trim(); // ?"\\"??????"/"????????? path = path.replace(BACKSLASH_CHAR, SLASH_CHAR); // ?????????????????windows?????????"C:"??"//hostname" String prefix = getSystemDependentPrefix(path, isWindows); if (prefix == null) { return null; } path = path.substring(prefix.length()); // ????????prefix???"/"??????????????prefix.length > 0 if (prefix.length() > 0 || path.startsWith(SLASH)) { prefix += SLASH_CHAR; } // ???path???"/" boolean endsWithSlash = path.endsWith(SLASH); // ??????"."?".." StringTokenizer tokenizer = new StringTokenizer(path, "/"); StringBuffer buffer = new StringBuffer(prefix.length() + path.length()); int level = 0; buffer.append(prefix); while (tokenizer.hasMoreTokens()) { String element = tokenizer.nextToken(); // ??"." if (CURRENT_DIR.equals(element)) { continue; } // ??".." if (UP_LEVEL_DIR.equals(element)) { if (level == 0) { // ??prefix????????????????????????? // ??null?????????? if (prefix.length() > 0) { return null; } buffer.append(UP_LEVEL_DIR).append(SLASH_CHAR); } else { level--; boolean found = false; for (int i = buffer.length() - 2; i >= prefix.length(); i--) { if (buffer.charAt(i) == SLASH_CHAR) { buffer.setLength(i + 1); found = true; break; } } if (!found) { buffer.setLength(prefix.length()); } } continue; } // ???path buffer.append(element).append(SLASH_CHAR); level++; } // ????????????"./" if (buffer.length() == 0) { buffer.append(CURRENT_DIR).append(SLASH_CHAR); } // ????????"/" if (!endsWithSlash && buffer.length() > prefix.length() && buffer.charAt(buffer.length() - 1) == SLASH_CHAR) { buffer.setLength(buffer.length() - 1); } return buffer.toString(); } private static boolean isWindows() { return System.getProperty("os.name").startsWith("Windows"); } private static String getSystemDependentPrefix(String path, boolean isWindows) { if (isWindows) { // ??UNC?? if (path.startsWith(UNC_PREFIX)) { // ????UNC???"//" if (path.length() == UNC_PREFIX.length()) { return null; } // ???????//hostname/subpath???//hostname int index = path.indexOf(SLASH, UNC_PREFIX.length()); if (index != -1) { return path.substring(0, index); } else { return path; } } // ??Windows??????"c:/..." if (path.length() > 1 && path.charAt(1) == COLON_CHAR) { return path.substring(0, 2).toUpperCase(); } } return ""; } }