Есть ли в Java метод соединения пути?

Точный дубликат:

объединить пути в java

Хотелось бы узнать, есть ли в Java такой метод. В качестве примера возьмем этот фрагмент:

// this will output a/b
System.out.println(path_join("a","b"));
// a/b 
System.out.println(path_join("a","/b");

person Geo    schedule 02.04.2009    source источник
comment
Это похоже на stackoverflow.com/questions/412380/combine-paths-in-java   -  person Daniel LeCheminant    schedule 03.04.2009
comment
См. Этот ответ: stackoverflow.com/a/20069477/1151521 показывает новый способ Java 7.   -  person Aleksandr Dubinsky    schedule 19.11.2013


Ответы (4)


Это касается версии Java 7 и ранее.

Чтобы процитировать хороший ответ на тот же вопрос:

Если вы хотите вернуть его в виде строки позже, вы можете вызвать getPath (). В самом деле, если вы действительно хотели имитировать Path.Combine, вы могли бы просто написать что-то вроде:

public static String combine (String path1, String path2) {
    File file1 = new File(path1);
    File file2 = new File(file1, path2);
    return file2.getPath();
}
person Community    schedule 02.04.2009
comment
Не работает в Java 8. Лучший вариант: import java.nio.file.Paths; Путь path = Paths.get (mydir, myfile); - person Marc Wittmann; 07.05.2015
comment
@MarcWittmann, что произойдет, если вы сделаете это в Java 8? - person Sam; 25.11.2015
comment
Решение намного короче с nio Java 7: Paths.get(path1, path2) - person Jason Yeo; 19.05.2016
comment
Просто обратите внимание, что Path / Paths не работают с jar-s, только с файловой системой. См. Например. stackoverflow.com/questions/941754/ - person Patrycja K; 20.07.2017

Пытаться:

String path1 = "path1";
String path2 = "path2";

String joinedPath = new File(path1, path2).toString();
person Peter Lawrey    schedule 03.04.2009
comment
getPath() или getAbsolutePath() не лучше, чем toString()? - person Matt Connolly; 03.10.2012
comment
Для справки в будущем: toString() совпадает с getPath() для класса File. - person fstanis; 12.02.2016
comment
@fstanis: Тем не менее getPath() более читабелен по сравнению с toString() (при условии, что они возвращают одно и то же) - person Nawaz; 28.05.2018

Один из способов - получить системные свойства, которые предоставляют разделитель путей для операционной системы, в этом руководстве объясняется, как это сделать. Затем вы можете использовать стандартное соединение строк с помощью file.separator.

person Soviut    schedule 02.04.2009

Это начало, я не думаю, что оно работает так, как вы предполагаете, но, по крайней мере, дает стабильный результат.

import java.io.File;

public class Main
{
    public static void main(final String[] argv)
        throws Exception
    {
        System.out.println(pathJoin());
        System.out.println(pathJoin(""));
        System.out.println(pathJoin("a"));
        System.out.println(pathJoin("a", "b"));
        System.out.println(pathJoin("a", "b", "c"));
        System.out.println(pathJoin("a", "b", "", "def"));
    }

    public static String pathJoin(final String ... pathElements)
    {
        final String path;

        if(pathElements == null || pathElements.length == 0)
        {
            path = File.separator;
        }
        else
        {
            final StringBuilder builder;

            builder = new StringBuilder();

            for(final String pathElement : pathElements)
            {
                final String sanitizedPathElement;

                // the "\\" is for Windows... you will need to come up with the 
                // appropriate regex for this to be portable
                sanitizedPathElement = pathElement.replaceAll("\\" + File.separator, "");

                if(sanitizedPathElement.length() > 0)
                {
                    builder.append(sanitizedPathElement);
                    builder.append(File.separator);
                }
            }

            path = builder.toString();
        }

        return (path);
    }
}
person TofuBeer    schedule 02.04.2009
comment
Работаем с платформой. Как показывают другие ответы, Java обрабатывает это для пользователей, поэтому на самом деле нет необходимости катить другой. - person MrMesees; 18.11.2016
comment
Потому что конструктор File дорог (с точки зрения времени). Он взаимодействует с файловой системой (зависит от реализации). Нет необходимости специально писать медленный код. При этом скорость должна быть измерена, поэтому возможно, что мой код медленнее. Кроме того, ответ, который я предоставил, работает для вещей, которые не основаны на файлах, поэтому он более гибкий. - person TofuBeer; 18.11.2016
comment
Мне очень жаль, но скорость для чего-то вроде этого - второстепенная проблема, особенно для сайта, который обеспокоен многими людьми, которые просто хотят знать, как действовать правильно. * Re реализует существующие функции Java-библиотек - person MrMesees; 18.11.2016
comment
Мне очень жаль, но скорость для чего-то вроде этого - второстепенная проблема, особенно для сайта, который обеспокоен многими людьми, которые просто хотят знать, как действовать правильно, поэтому мы приняли ответы. В моем ответе нет ничего технически неправильного, он работает, он решает проблему (скорость) и показывает, как делать то же самое, если это не файлы. Нельзя сказать, что скорость для этого не имеет значения, а что, если ее называют миллионы раз? - person TofuBeer; 18.11.2016
comment
он работает, он решает проблему (скорость). Как вы упомянули выше, без тестов мы не знаем, что это быстрее. Вы подняли этот вопрос, пожалуйста, не рекламируйте скорость без некоторых тестов, если это является целью. он показывает, как делать то же самое, если это не файлы. Вы используете File.separator в своем примере, я не понимаю, как он переносится на широкий спектр нефайловых систем, не могли бы вы объяснить? - person MrMesees; 18.11.2016
comment
Мы также не знаем, что это медленнее. Никто из нас не может сделать законных заявлений о скорости, за исключением того факта, что текущий JDK стоит дорого (мы просто не знаем, насколько он дорог). Мы также не знаем, как часто он будет вызываться, поэтому скорость может быть фактором, а может и не быть. Учитывая, что мы не знаем этих вещей, нет никаких проблем с предоставлением чего-то, что работает в качестве альтернативы, особенно когда это более гибко (что, если вы хотите использовать; вместо /?) - person TofuBeer; 18.11.2016
comment
Я не понимаю твою точку зрения, я указывал, что ты срываешь это с рельсов, упоминая скорость (ты делал это много, я пытался обойти эту проблему, говоря, что скорость для чего-то вроде этого является второстепенным. беспокойство). Если бы вы хотели использовать /? или ; для разделения вы можете использовать встроенную функцию соединения со списком (также ядром Java) и разделителем. В любом случае, похоже, вы не готовы принять причину, чтобы я мог знать, что пытался объяснить, и что мы должны продолжать нашу жизнь. - person MrMesees; 21.11.2016
comment
Как правило, скорость не имеет значения, пишите код, чтобы он был правильным, ясным и гибким, если окажется, что он медленный, ищите способы его ускорить. Код, который я опубликовал, правильный (или близок к нему, учитывая, что я не уверен на 100% в требованиях), он ясен (на мой взгляд) и является гибким (в большей степени, чем способ File). Это может быть или не быть быстрее, если посмотреть на код для File, можно увидеть, что файловая система используется в некоторых случаях, что может вызвать замедление. Без тестирования мы не знаем. Проблема, с которой я столкнулся со скоростью, заключается в том, что вы сказали, что это не имеет значения, не зная, имеет ли это значение или нет. - person TofuBeer; 21.11.2016
comment
Я хочу сказать, что вы довольно критично относитесь к примеру правильного (насколько нам известно, никто не сказал, что это неправильный), кода. Я не возражаю против голосов за что-то не так, и я не против критики / обсуждения. Извините, я нашел ваше заявление: "Мне очень жаль, но скорость для чего-то вроде этого - второстепенная проблема, особенно для сайта, который беспокоит многих людей, которые просто хотят знать, как действовать правильно, - что на самом деле не так с код, который я опубликовал, то есть как он технически не работает? Откуда вы знаете, что скорость не имеет значения? - person TofuBeer; 21.11.2016
comment
Протестировал скорость, могу выложить код, если хотите. Мой способ (без проверки ошибок, чтобы соответствовать другому способу) является самым быстрым на моем компьютере с очень небольшим отрывом. Я также попробовал String.join, которого не существовало, когда я писал свой ответ, и по какой-то причине он также работает медленнее, что удивительно (мне нужно посмотреть их источник). Так что скорость здесь вообще не фактор, но теперь мы знаем. - person TofuBeer; 21.11.2016