# Slash durch Systembezogenen Fileseparator ersetzen



## freez (31. Aug 2011)

Hallo,

ich möchte folgendes machen:

```
String test = "test/test.html";
test = test.replaceAll("/", System.getProperty("file.separator"));
```

dabei fliegt mir eine java.lang.StringIndexOutOfBoundsException:

```
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:

```
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 
	
	
	
	





```
String test = "test/test.html";
```
. Nun möchte ich dieses File herunterladen und in einem Directory mit derselben Ordnerstruktur speichern (Windows: 
	
	
	
	





```
c:\directory\test\test.html
```
 und für Linux wäre es: 
	
	
	
	





```
/directory/test/test.html
```
).


----------



## jgh (31. Aug 2011)

klappt denn diese Version auf einem Linux nicht?


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


----------



## hansmueller (31. Aug 2011)

Hallo,

schau dir mal die Api an: String (Java Platform SE 6)

MfG
hansmueller


----------



## hansmueller (31. Aug 2011)

Hallo,

hier die Lösung:

```
test = test.replaceAll("/", Matcher.quoteReplacement(System.getProperty("file.separator")));
```

und nicht das 
	
	
	
	





```
import java.util.regex.Matcher;
```
 vergessen.

MfG
hansmueller


----------



## freez (31. Aug 2011)

hansmueller hat gesagt.:


> Hallo,
> 
> hier die Lösung:
> 
> ...


Danke, so geht es . Jetzt muss ich nur mal schauen, was die Methode 
	
	
	
	





```
quoteReplacement
```
 eigentlich macht.


----------



## freez (31. Aug 2011)

hansmueller hat gesagt.:


> schau dir mal die Api an: String (Java Platform SE 6)



Die kenne ich, nur löst sie mir nicht das Problem in Zusammenhang mit System.getProperty.


----------



## freez (31. Aug 2011)

jgh hat gesagt.:


> klappt denn diese Version auf einem Linux nicht?
> 
> 
> ```
> ...



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.


----------



## BlackViruZ (31. Aug 2011)

freez hat gesagt.:


> 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..


----------



## hansmueller (31. Aug 2011)

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


----------



## freez (31. Aug 2011)

hansmueller hat gesagt.:


> "\" 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.



hansmueller hat gesagt.:


> 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


----------



## FerFemNemBem (31. Aug 2011)

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.


----------



## freez (31. Aug 2011)

FerFemNemBem hat gesagt.:


> 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.



Ist auf jeden Fall kürzer . Gefällt mir persönlich auch besser.


----------



## mvitz (31. Aug 2011)

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!


----------



## freez (31. Aug 2011)

tatsächlich. Das ist mir neu ... sogar [c]"c:\\dir\\test/test.html"[/c] funktioniert. Seit welcher Java Version funktioniert das so?


----------



## musiKk (31. Aug 2011)

Warum nimmst Du nicht einfach [c]replace()[/c] statt [c]replaceAll()[/c]? Das arbeitet mit Strings und nicht mit regulären Ausdrücken.


----------



## vanny (31. Aug 2011)

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


----------



## freez (31. Aug 2011)

vanny hat gesagt.:


> 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.


----------



## faetzminator (31. Aug 2011)

vanny hat gesagt.:


> bei LINUX und Windoof mag es ja so funktionieren mit "C:..usw." [...]



Nein, Linux hat natürlich keine Volumes  In Linux beginnt auch alles an der Wurzel, also [c]/[/c].


----------



## vanny (31. Aug 2011)

Das mit LINUX wusste ich noch garnicht ^^ danke:tollobwohl 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


----------

