Slash durch Systembezogenen Fileseparator ersetzen

freez

Top Contributor
Hallo,

ich möchte folgendes machen:
Java:
String test = "test/test.html";
test = test.replaceAll("/", System.getProperty("file.separator"));

dabei fliegt mir eine java.lang.StringIndexOutOfBoundsException:
Code:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
	at java.lang.String.charAt(String.java:686)
	at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
	at java.util.regex.Matcher.replaceAll(Matcher.java:813)
	at java.lang.String.replaceAll(String.java:2189)
	at test.Test.run03(Test.java:63)
	at test.Test.main(Test.java:31)

ich weiß bereits, dass sowas geht:
Java:
test = test.replaceAll("/", "\\\\");
Allerdings nur für Windows. Dies sollte natürlich Betriebssystemunabhängig sein. Wie kann ich das hin bekommen? Bei google bin ich nicht fündig geworden.


Erklärung: ich habe ein String, in dem der Fileanteil eines URL steht
Code:
String test = "test/test.html";
. Nun möchte ich dieses File herunterladen und in einem Directory mit derselben Ordnerstruktur speichern (Windows:
Code:
c:\directory\test\test.html
und für Linux wäre es:
Code:
/directory/test/test.html
).
 
klappt denn diese Version auf einem Linux nicht?

Java:
test = test.replaceAll("/", "\\"+System.getProperty("file.separator"));
 
Hallo,

hier die Lösung:
Java:
test = test.replaceAll("/", Matcher.quoteReplacement(System.getProperty("file.separator")));

und nicht das
Code:
import java.util.regex.Matcher;
vergessen.

MfG
hansmueller
 
Hallo,

hier die Lösung:
Java:
test = test.replaceAll("/", Matcher.quoteReplacement(System.getProperty("file.separator")));

und nicht das
Code:
import java.util.regex.Matcher;
vergessen.

MfG
hansmueller
Danke, so geht es 🙂. Jetzt muss ich nur mal schauen, was die Methode
Code:
quoteReplacement
eigentlich macht.
 
klappt denn diese Version auf einem Linux nicht?

Java:
test = test.replaceAll("/", "\\"+System.getProperty("file.separator"));

Danke, das geht auch ... jedenfalls unter Windows ... hätte ich eigentlich nicht gedacht.

Unter Linux kann ich es gerade nicht testen, da ich aktuell keins zur Verfügung stehen habe ... aber ich vermute, dass es geht.
 
Danke, das geht auch ... jedenfalls unter Windows ... hätte ich eigentlich nicht gedacht.

Unter Linux kann ich es gerade nicht testen, da ich aktuell keins zur Verfügung stehen habe ... aber ich vermute, dass es geht.

Ist aber dennoch keine gute Idee, nimm lieber die saubere Variante mit quoteReplacement.
Schließlich weißt du ja nicht zwingend ob die Plattform auf der du dein Programm startest denn auch einen file seperator verwendet welcher ein "steuerzeichen" bei regex ist.

Wenn du quoteReplacement nimmst bist du auch da auf der sicheren seite.. 🙂
 
Hallo,
freez hat gesagt.:
Die kenne ich, nur löst sie mir nicht das Problem in Zusammenhang mit System.getProperty

Versteh ich jetzt nicht ganz? ???:L

Da steht doch ganz deutlich:
Java-Api - String - replaceAll hat gesagt.:
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use Matcher.quoteReplacement(java.lang.String) to suppress the special meaning of these characters, if desired.

"\" und "$" werden anscheinend nicht als normale Zeichen betrachtet - und mit dem quoteReplacement unterdrückt man diese Sonderbehandlung.

MfG
hansmueller
 
"\" und "$" werden anscheinend nicht als normale Zeichen betrachtet
Ich weiß ... deswegen habe ich bei der Windows Variante auch [c]"\\\\"[/c] verwendet. Nur da unter Linux ein [c]"/"[/c] verwendet wird, fiel mir keine Lösung ein, die unter beiden System läuft.

und mit dem quoteReplacement unterdrückt man diese Sonderbehandlung.

Hier muss ich beschämend feststellen, dass mein Englisch wohl doch nicht das Beste ist. Ich habe den Teil in der Doku missverstanden 🙂 Danke 🙂
 
Halloechen,

ich persoenlich finde es etwas lesbarer, wenn mann statt des [c]System.getProperty("file.separator")[/c] einfach [c]File.separator[/c] bzw. [c]File.separatorChar[/c] verwendet.

Gruss, FFNB.
 
Und wieso in dem Fall nicht einfach mit / weiterarbeiten? Java stört es auch unter Windows kein bisschen, wenn man einen / als Pfadtrenner nimmt.

C:/test/test.html geht genau so wie C:\test\test.html und wenn du nachher mit den \ noch weiterarbeiten musst, baust du das ganze evtl. wieder zu / zurück, eigentlich unnötig!
 
tatsächlich. Das ist mir neu ... sogar [c]"c:\\dir\\test/test.html"[/c] funktioniert. Seit welcher Java Version funktioniert das so?
 
Warum nimmst Du nicht einfach [c]replace()[/c] statt [c]replaceAll()[/c]? Das arbeitet mit Strings und nicht mit regulären Ausdrücken.
 
Apropos systemunabhängig,

bei LINUX und Windoof mag es ja so funktionieren mit "C:..usw." mir ist aber aufgefallen, das wenn man den MAC noch mit rein nimmt die absolute Pfadangabe mit "/Volumes/..." beginnt.
Nur als kleiner Denkansatz, falls auch das mal vorkommen sollte.

Gruß Vanny
 
bei LINUX und Windoof mag es ja so funktionieren mit "C:..usw." mir ist aber aufgefallen, das wenn man den MAC noch mit rein nimmt die absolute Pfadangabe mit "/Volumes/..." beginnt.

Das sollte kein Problem sein, da der Anfang des Pfades dem Programm immer bekannt und nicht fest in den Sourcen hinterlegt sein sollte. Das ist ja auch irgendwie logisch, da ich ja keinen festen Pfad vorgeben kann, der ist nunmal PC- und BS- abhängig.
 
Das mit LINUX wusste ich noch garnicht ^^ danke:toll🙁obwohl steht ja oben:autsch🙂

Ich wollte es nur anmerken, damit es hier nicht unter den Tisch fällt und später ein Problem darstellt.

Gruß Vanny
 

Zurück
Oben