В чем разница между использованием File.separator
и нормалью /
в Java Path-String?
В отличие от двойной обратной косой черты, \\
независимость от платформы, похоже, не является причиной, поскольку обе версии работают под Windows и Unix.
public class SlashTest {
@Test
public void slash() throws Exception {
File file = new File("src/trials/SlashTest.java");
assertThat(file.exists(), is(true));
}
@Test
public void separator() throws Exception {
File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
assertThat(file.exists(), is(true));
}
}
Перефразируя вопрос, если /
работает на Unix и Windows, почему нужно когда-либо использовать File.separator
?
Ответы:
С библиотеками Java для работы с файлами вы можете безопасно использовать
/
(косую черту, а не обратную косую черту) на всех платформах. Код библиотеки обрабатывает перевод вещей в платформо-зависимые пути внутри страны.Однако вы можете захотеть использовать его
File.separator
в пользовательском интерфейсе, потому что лучше показать людям, что имеет смысл в их ОС, а не что имеет смысл для Java.Обновление : я не смог за пять минут поиска найти документированное поведение "всегда можно использовать косую черту". Теперь, я уверен, что я видел это задокументированным, но в отсутствие нахождения официальной ссылки (потому что моя память не идеальна), я бы продолжал использовать,
File.separator
потому что вы знаете, что это будет работать.источник
File
используетсяFileSystem.normalize
повсеместно для «нормализации» путей, полученных через общедоступный API, и почти все, что касается строк пути к файлу (например,FileWriter(String)
), используетсяFile
под прикрытием.File
.Вы используете,
File.separator
потому что когда-нибудь ваша программа может работать на платформе, разработанной в далекой стране, стране странных вещей и незнакомых людей, где лошади плачут, а коровы управляют всеми лифтами. На этой земле люди традиционно используют символ «:» в качестве разделителя файлов, и поэтому JVM покорно подчиняется их желаниям.источник
Хотя использование File.separator для ссылки на имя файла является излишним (для тех, кто представляет себе далекие земли, я думаю, что их реализация JVM заменит a
/
на:
аналогично тому, как jvm из окон заменяет его на a\
).Однако иногда вы получаете ссылку на файл, а не создаете его, и вам необходимо проанализировать его, и для того, чтобы сделать это, вам нужно знать разделитель на платформе. File.separator поможет вам сделать это.
источник
Хорошо, давайте проверим некоторый код.
File.java
строки с 428 по 435 вFile.<init>
:И давайте прочитаем
fs/*(FileSystem)*/.fromURIPath()
документы:Это означает,
FileSystem.fromURIPath()
что постобработка по пути URI только в Windows, и потому в следующей строке:Он заменяет каждый «/» на системно-зависимый
seperatorChar
, вы всегда можете быть уверены, что «/» безопасен в каждой ОС.источник
Ну, есть больше ОС, чем Unix и Windows (портативные устройства и т. Д.), А Java известна своей переносимостью. Лучше всего использовать его, чтобы JVM могла определить, какая из них лучше для этой ОС.
источник
:
разделители в стиле Mac давно исчезли. Кажется, что все, кроме Windows, больше используют стандарт/
. И даже окна теперь прекрасно справляются со слешами. Попробуйтеcd /windows/system
в системе Windows 10 с основного системного диска. Хотя вы по-прежнему хотите отображать пути с помощью системного разделителя (чтобы не вводить пользователей в заблуждение), вы можете просто использовать косую черту в/
любом месте и быть уверенным, что ваш код будет работать везде, где вы, вероятно, будете его развертывать.Хотя это не имеет большого значения на обратном пути, но на обратном пути.
Конечно, вы можете использовать «/» или «\» в новом файле (путь строки), но File.getPath () даст вам только один из них.
источник
/
или обратную\\
косую черту. Но в любом другом месте лучше использовать косую черту,/
иначе у вас будут проблемы.Поздно на вечеринку. Я на Windows 10 с JDK 1.8 и Eclipse MARS 1.
Я считаю, что
getClass().getClassLoader().getResourceAsStream("path/to/resource");
работает и
getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");
не работает и
getClass().getClassLoader().getResourceAsStream("path\to\resource");
не работает. Последние два эквивалентны. Итак ... У меня есть веская причина НЕ использовать File.separator.
источник
getClass().getClassLoader().getResourceAsStream("path\to\resource");
есть табуляция (\t
) и возврат каретки (\r
).File.separator
что это обратный слеш. Это только в жестко запрограммированных строках, где он рассматривается как экранирующий символ, где вам нужно экранировать обратную косую черту. Если вы сохранили символ в текстовом файле, или вchar
или,String
то вам не нужно экранировать его во второй раз, поскольку он уже был преобразован в ожидаемый символ обратной косой черты. Попробуйте сами, чтобы увидеть:String backslash = "\\"; System.out.println("welcome" + backslash + "to" + backslash + "reality");
Портативность просто и понятно.
источник
/
или системный разделительFile.separator
. Оба из них, кажется, работают везде. ХотяFile.separator
гарантированно работает везде, простой слэш/
также, кажется, работает везде. Если это не сработает где-то, то я бы хотел услышать об этом. Я считаю, что это будет работать на всех системах. По крайней мере, я еще не нашел нигде, где бы/
это не работало (Mac OSX, Windows, * nix, Android, iOS - я не проверял Mac до OSX, которые использовали «:» в качестве разделителя, OS / 2, NeXT или любая другая действительно древняя ОС).«Java SE8 для программистов» утверждает, что Java справится с любым из них. (стр. 480, последний абзац). В примере утверждается, что:
разберутся просто отлично. Обратите внимание на последний разделитель (в стиле Unix).
Это липко и, вероятно, подвержено ошибкам, но это то, что они (Deitel и Deitel) утверждают.
Я думаю, что путаница для людей, а не Java, является достаточной причиной, чтобы не использовать эту (неправильную?) Функцию.
источник
Как господа описали разницу с деталями варианта.
Я хотел бы рекомендовать использовать Apache Commons io api, класс
FilenameUtils
при работе с файлами в программе с возможностью развертывания на нескольких ОС.источник
Путь к файлу или каталогу указывается с использованием соглашений об именах хост-системы. Однако класс File определяет зависящие от платформы константы, которые можно использовать для обработки имен файлов и каталогов независимо от платформы.
Files.seperator определяет символ или строку, которые разделяют каталог и компоненты файла в имени пути. Этот разделитель - '/', '\' или ':' для Unix, Windows и Macintosh соответственно.
источник
Если вы используете Java 7, проверьте Path.resolve () и Paths.get () .
источник
Использование File.separator заставило Ubuntu генерировать файлы с «\» в имени вместо каталогов. Может быть, мне лень, как я делаю файлы (и каталоги), и я мог бы избежать этого, независимо от того, что каждый раз использую «/», чтобы избежать файлов с «\» в названии.
источник
Что вы должны сделать, если вы пытаетесь создать файл по какому-либо готовому пути (сохраненному в базе данных, например), используя разделитель Linux?
Может быть, просто используйте путь для создания файла:
Но Windows использует другой разделитель (
\
). Итак, является ли альтернативой преобразование разделителя слеша в платформу независимым? Подобно:Этот метод,
convertPathToPlatformIndependent
вероятно, будет иметь какое-то разделение на "/" и объединиться с File.separator.Ну, для меня это нехорошо для языка, который не зависит от платформы (верно?), А Java уже поддерживает использование в
/
Windows или Linux. Но если вы работаете с путями и вам нужно каждый раз вспоминать об этом преобразовании, это будет кошмаром, и вы не получите никакой реальной выгоды для приложения в будущем (возможно, во вселенной, описанной @Pointy).источник