Как получить чистый абсолютный путь к файлу в Java, независимо от ОС?
Вот проблема. После некоторых конкатенаций у меня может быть строка вроде этого
"C:/shared_resources/samples\\import_packages\\catalog.zip"
или даже это
"C:/shared_resources/samples/subfolder/..\\import_packages\\catalog.zip"
Я хочу иметь некоторый код, который преобразует такую строку в путь с равномерными разделителями.
Первое решение, которое приходит на ум, использует new File(srcPath).getCanonicalPath()
, однако здесь сложная часть. Этот метод зависит от системы, в которой выполняются тесты. Однако мне нужно передать строку на удаленную машину (Selenium Grid node с браузером там), а в системах здесь и там есть Linux и Windows соответственно. Поэтому попытка сделать new File("C:/shared_resources/samples\\import_packages\\catalog.zip").getCanonicalPath()
приводит к чему-то вроде "/home/username/ourproject/C:/shared_resources/samples/import_packages/catalog.zip"
. И использование тупой замены регулярных выражений тоже не очень хорошее решение.
Есть ли способ просто обрезать путь и сделать разделители единообразными (и, возможно, разрешать ..
), не пытаясь его абсолютизировать абсолютизировать?
Ответы
Ответ 1
Попробуйте следующее:
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws IOException {
Path path = Paths.get("myFile.txt");
Path absolutePath = path.toAbsolutePath();
System.out.println(absolutePath.toString());
}
}
Ответ 2
Попробуйте FilenameUtils.normalize()
от Apache commons-io
Ответ 3
Вы можете использовать:
Path absolutePath = path.toAbsolutePath().normalize();
... хотя бы для устранения избыточных относительных секций. Как упоминается в документации для normalize(), в случае, если удаленный узел пути фактически являлся ссылкой, разрешенный файл может отличаться или больше не может быть разрешен.
Ответ 4
например, вот ваш путь:
String jarName = "C:/shared_resources/samples\\import_packages\\catalog.zip"
jarName.replaceAll("/", "\\");
jarName.replaceAll("..", "/");