Одинаковы ли разделители путей (delimiters) в Windows и Unix-подобных системах?

Ответ

Нет, разделители путей по умолчанию различаются.

Система Разделитель каталогов Пример абсолютного пути
Windows Обратная косая черта () C:UsersDocumentfile.txt
Unix/Linux/macOS Прямая косая черта (/) /home/user/document/file.txt

Как правильно работать с путями в Java для кроссплатформенности?

  1. Использовать класс java.nio.file.Path и Paths.get() (рекомендуется):

    // JVM автоматически использует корректный разделитель
    Path path = Paths.get("myDir", "subDir", "file.txt");
    System.out.println(path); // На Unix: myDir/subDir/file.txt
                              // На Windows: myDirsubDirfile.txt
  2. Использовать константу File.separator:

    String path = "dir" + File.separator + "file.txt";
  3. Использовать прямую черту (/) в строковых литералах: Виртуальная машина Java (JVM) на Windows автоматически корректно интерпретирует / при работе с классами File или Path.

    // Этот код будет работать и на Windows, и на Unix
    File file = new File("src/main/resources/config.yml");

Вывод: Для написания переносимого кода всегда предпочитайте Paths.get() или File.separator ручной конкатенации строк с жёстко заданными разделителями.

Ответ 18+ 🔞

А, ну вот, классика, блядь! Опять эти пути, как будто впервые слышу, ёпта! Сидишь такой, пишешь код, и тут — бац! — на тебе, сука, обратный слеш, а не тот, который надо. И всё, пиздец, программа на линуксе как корова на льду, а ты сидишь и думаешь: «Ну что за мудак это писал?» А мудак-то — ты сам, блядь!

Смотри сюда, чтобы не быть таким же, как я в тот раз. Запомни раз и нахуй:

Система Разделитель, блядь Пример, чтобы было понятно даже идиоту
Windows Обратная косая () C:UsersDocumentfile.txt
Unix/Linux/macOS Прямая косая (/) /home/user/document/file.txt

Видишь разницу? Одна система как будто зеркальная, блядь! Ну и как с этим жить, чтобы не обосраться? А вот как, слушай:

Первое и главное — используй java.nio.file.Path. Это твой новый бог, идол и спаситель, блядь!

// Сделай вот так, и JVM сама всё порешает, как взрослая
Path path = Paths.get("myDir", "subDir", "file.txt");
System.out.println(path); // На Линуксе: myDir/subDir/file.txt
                          // На Винде: myDirsubDirfile.txt

Видишь? Никаких танцев с бубном. Просто сказал, что соединить, а система сама подставит свой родной, ёбаный, разделитель. Красота, в рот меня чих-пых!

Второй вариант — константа File.separator. Ну, если ты старовер и любишь по-старому.

String path = "dir" + File.separator + "file.txt";

Работает, конечно, но выглядит как костыль из прошлого века, блядь. Но работает!

И третий лайфхак для ленивых — просто пиши / везде!

// Да-да, вот так вот, нагло. И Винда проглотит.
File file = new File("src/main/resources/config.yml");

JVM на Винде — хитрая жопа, она сама поймёт, что ты имел в виду, и подменит слеш на свой, родной, кривой. Но это, конечно, не отменяет того, что лучше использовать первый способ, как нормальный человек.

Итог, блядь, простой, как три копейки: не выёбывайся, не строй из себя умника с конкатенацией строк. Бери Paths.get() и живи спокойно. А то будешь потом, как я, искать, почему на сервере всё падает, а у тебя на компе — летает. Пиздец и позор.