Java-эквивалент буквальных строк C # с @

101

Быстрый вопрос. Есть ли эквивалент @ применительно к строкам в Java:

Например, я могу сделать это @"c:\afolder\afile"на C # и заставить его игнорировать escape-символы при обработке вместо того, чтобы делать это "c:\\afolder\\aFile". Есть ли эквивалент в Java?

хммм: stackoverflow ускользает от меня .. лол. Второй пример следует читать:

c: (двойная обратная косая черта) после (двойная обратная косая черта) aFile

Саймон Ригби
источник
2
Возможный дубликат: stackoverflow.com/questions/2018556/…
codaddict
2
Взял на себя смелость пояснить заголовок, поскольку @его можно использовать также для использования ключевых слов языка в качестве идентификаторов.
Joey
@unicornaddict - да, действительно, это тот же вопрос. Извинения не увидели этого при поиске. @ Johannes - хороший ход .. спасибо
Саймон Ригби
Если вы хотите сделать именно это в Windows и используете Windows XP или новее (и вы должны это сделать!), Тогда вы можете просто сделать File file = new File ("C: / afolder / afile"); С другой стороны, если вы хотите быть более портативным, вам следует взглянуть на отличный ответ @CPerkins.
Haakon Løtveit
Обратите внимание (январь 2018 г.), необработанные строковые литералы могут появиться для Java (JDK 10 или более): см. В Java, есть ли способ написать строковый литерал без необходимости экранирования кавычек? .
VonC

Ответы:

77

Нет . Ваш единственный выбор - экранирование / экстернализация строки.

Кент Бугарт
источник
7
я люблю C # 6 с @ "string" и $ "string {i}" и очень фьючерсы больше, чем java
Гвидо Моча
4
Переход от C # к Java во многих отношениях часто является шагом вниз
МайкКуллс
33

Нет, в Java нет буквальных строковых литералов .

Тем не менее, если вам нужен Java-подобный (и основанный на Java-VM) язык , вы можете взглянуть на Groovy, который имеет различные формы строковых литералов .

Джон Скит
источник
Первая ссылка (дословные строковые литералы) указывает на «Устаревшую техническую документацию Visual Studio 2003», groovy.codehaus.org ссылки не работают
Владас Майер
1
@ace: обновлено до текущей «строковой» статьи, которая включает раздел о дословных строковых литералах. Также обновлены ссылки Groovy.
Джон Скит
16

Как сказали Кент и Джон, нет.

Я отвечаю только для того, чтобы указать, что даже если бы это было, для вашего конкретного случая, это было бы плохой идеей в общем случае, если бы предполагалось, что программа будет более чем разовой.

Программы Java работают не только на Windows, но и на других платформах, у которых другие разделители файлов. Итак, вместо того, чтобы иметь дело с экранированными обратными косыми чертами, правильный способ обработки вашего конкретного примера - получить свойство разделителя файлов:


    String sep = System.getProperty("file.separator");
    String filename = ROOTDIR + sep + "folder" + sep + "afile";

Где вы бы отдельно создали ROOTDIR на основе некоторой политики - не только платформы, но и того, хотите ли вы, чтобы ваш «файл» относился к фактическому корню файловой системы или к домашнему каталогу пользователя.

Но, безусловно, использование свойства разделителя файлов делает ваши программы более удобными. Это больше работы? Да. Как говорит Ванда Сайкс: «Но оно того стоит».

CPerkins
источник
1
Привет и спасибо. тот факт, что его «имя файла» в моем случае не имеет значения. Весь мой код берет строку (или пытается) и передает ее. На самом деле я ничего не делаю с ним, кроме как передаю его веб-службе. Я тестировал ответ от службы C # WCF, вызываемой из Java. Поскольку я только что жестко кодировал тест, именно в этот момент я обнаружил это ограничение. Я на самом деле ничего не делаю со строкой «на файловой основе».
Саймон Ригби,
2
Дословные строки отлично подходят для шаблонов регулярных выражений.
Gordon Bean
12

В настоящее время он не поддерживается в Java, но может быть доступен в будущих выпусках. 23.01.2018 был создан JEP 326: Raw String Literals.

Следите за прогрессом на https://bugs.openjdk.java.net/browse/JDK-8196004

Возможно, когда-нибудь вы сможете это сделать с помощью:

`c:\afolder\afile`

ОБНОВЛЕНИЕ: JEP предложил отказаться от JDK 12: 326: необработанные строковые литералы (предварительная версия). Вы можете прочитать обоснование здесь: http://mail.openjdk.java.net/pipermail/jdk-dev/2018-De December/002402.html

И подробнее здесь https://bugs.openjdk.java.net/browse/JDK-8215682

Итог : в ближайшем будущем в Java не будет дословных строк. И даже если он появится, скорее не будет ''.

Енгильин
источник
1
Поскольку это одна из самых популярных дискуссий по данному вопросу, JEP 326 был отозван. Обсуждение было возобновлено в январе 2019 года , и теперь оно отслеживается в JEP 355 для выпуска JDK13.
NPras