Odpowiednik Java ciągów dosłownych C # z @

101

Szybkie pytanie. Czy istnieje odpowiednik @ zastosowany do ciągów znaków w Javie:

Na przykład mogę to zrobić @"c:\afolder\afile"w C # i ignorować znaki ucieczki podczas przetwarzania, zamiast robić "c:\\afolder\\aFile". Czy istnieje odpowiednik Java?

hmmm: stackoverflow ucieka na mnie .. lol. Drugi przykład powinien brzmieć:

c: (podwójny lewy ukośnik) afolder (podwójny odwrotny ukośnik) aFile

Simon Rigby
źródło
2
Możliwy duplikat: stackoverflow.com/questions/2018556/…
codaddict
2
Pozwolił sobie sprecyzować tytuł, ponieważ @można go również użyć do używania słów kluczowych języka jako identyfikatorów.
Joey
@unicornaddict - tak, rzeczywiście, to to samo pytanie. Przeprosiny nie widziały tego podczas wyszukiwania. @ Johannes - dobry ruch .. dzięki
Simon Rigby
Jeśli chcesz to zrobić w systemie Windows i używasz systemu Windows XP lub nowszego (a powinieneś!), Możesz po prostu zrobić Plik plik = nowy Plik ("C: / afolder / afile"); Z drugiej strony, jeśli chcesz być bardziej przenośny, powinieneś spojrzeć na doskonałą odpowiedź @CPerkins.
Haakon Løtveit,
Uwaga (styczeń 2018 r.), Surowe literały ciągów mogą pojawić się w Javie (JDK 10 lub więcej): zobacz: Czy w Javie istnieje sposób na napisanie literału ciągu bez konieczności ucieczki w cudzysłów? .
VonC

Odpowiedzi:

77

Nie . Zmiana znaczenia / eksternalizacja ciągu to jedyny wybór.

Kent Boogaart
źródło
7
Uwielbiam c # 6 z @ "string" i $ "string {i}" i bardzo przyszłościowe bardziej niż java
Guido Mocha
4
Przejście z C # na Javę jest dość często krokiem w dół na wiele sposobów
MikeKulls
33

Nie, Java nie ma dosłownych literałów ciągu .

Jeśli jednak potrzebujesz języka podobnego do Java (i opartego na Java-VM), który to robi , możesz spojrzeć na Groovy, który ma różne formy literału ciągu .

Jon Skeet
źródło
Pierwsze łącze (dosłowne literały ciągu) wskazuje na łącza „Dokumentacja techniczna programu Visual Studio 2003 na emeryturze” groovy.codehaus.org są uszkodzone
Vladas Maier
1
@ace: zaktualizowano do aktualnego artykułu „string”, który zawiera sekcję poświęconą dosłownym literałom ciągów. Zaktualizowano także linki Groovy.
Jon Skeet
16

Jak powiedzieli Kent i Jon, nie, nie ma.

Odpowiadam tylko po to, aby wskazać, że nawet gdyby istniał, dla twojego konkretnego przypadku, byłby to zły pomysł w ogólnym przypadku, zakładając więcej niż jednorazowy program.

Programy Java działają na większej liczbie platform niż tylko Windows, a inne platformy mają inne ograniczniki plików. Więc zamiast zajmować się odwrotnymi ukośnikami uciekającymi, prawidłowym sposobem obsługi konkretnego przykładu jest pobranie właściwości separatora plików:


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

Tam, gdzie osobno utworzyłbyś ROOTDIR na podstawie pewnych zasad - nie tylko platformy, ale także tego, czy chcesz, aby twój „plik” był względny w stosunku do rzeczywistego katalogu głównego systemu plików, czy też względem katalogu domowego użytkownika.

Ale zdecydowanie użycie właściwości separatora plików sprawia, że ​​programy są bardziej użyteczne. Czy to więcej pracy? Tak. Jak mówi Wanda Sykes: „Ale warto”.

CPerkins
źródło
1
Cześć i dzięki. fakt, że jest to „nazwa pliku” w moim przypadku, w pewnym sensie nieistotny. Wszystko, co robi mój kod, to pobieranie łańcucha (lub próba) i przekazywanie go dalej. Właściwie nie robię z nim nic poza przekazaniem go do usługi internetowej. Testowałem odpowiedź z usługi ac # WCF wywoływanej z Javy. Ponieważ byłem tylko trudnym kodem testu, w tym momencie odkryłem to ograniczenie. Tak naprawdę nie robię niczego „opartego na plikach” z łańcuchem.
Simon Rigby,
2
Ciągi dosłowne doskonale nadają się do wzorców wyrażeń regularnych.
Gordon Bean
12

Obecnie nie jest obsługiwany w Javie, ale może być dostępny w przyszłych wersjach. W dniu 2018/01/23 utworzono JEP 326: Raw String Literals

Zobacz postęp na https://bugs.openjdk.java.net/browse/JDK-8196004

Pewnie pewnego dnia będziesz mógł to zrobić za pomocą:

`c:\afolder\afile`

UPDATE: JEP zaproponował usunięcie z JDK 12: 326: Raw String Literals (Preview) Możesz przeczytać uzasadnienie tutaj: http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html

Więcej szczegółów tutaj https://bugs.openjdk.java.net/browse/JDK-8215682

Podsumowując : w najbliższej przyszłości w Javie nie będzie napisów dosłownych. A nawet jeśli się pojawi, to raczej nie będzie ''.

engilyin
źródło
1
Ponieważ jest to jedna z najpopularniejszych dyskusji w tej sprawie, JEP 326 został wycofany. Dyskusja została wznowiona w styczniu 2019 r. I jest teraz śledzona w JEP 355 dla wydania JDK13.
NPras