Witam
Czy wie ktoś jak obejść na windowsie problem z kodem poniżej ?
String tmp = "C:\xx\z.txt";
tmp = tmp.replaceAll( "[/\]+", File.separator );
Witam
Czy wie ktoś jak obejść na windowsie problem z kodem poniżej ?
String tmp = "C:\xx\z.txt";
tmp = tmp.replaceAll( "[/\]+", File.separator );
Jaki problem ?
Dlaczego nie tak
String tmp = "C:"+File.separator+"xx"+File.separator+"z.txt";
?
Może się trochę wyraziłem
Mam plik w którym użytkownik definuje katalogi :) w postaci
Katalog1\Katalog2\Katalog3 itd.
Niestety nie mam 100% pewności że napisze to z ""
Dla przeciętnego użytkownika nie ma różnicy między "" a "/" więc równie dobrze może napisać
Katalog1/Katalog2/Katalog3
Druga rzecz chodzi o multiplatformować. na Unixie mamy "/" a na windzie ""
Dlatego jednak wolałbym to zrobić jakimś replacem
W jaki sposób tworzysz String "katalog1\katalog2\katalog3" ? Składasz z kawałków wpisanych przez użytkownika, czy odczytujesz w całości ? Jeśli to drugie, to problem jest w tym, że "katalog1\katalog2\katalog3" w ogóle nie jest Stringiem.
Użytkownik wpisuje "ręcznie" Katalog1\Katalog2 do pliku i z tamtąd program ma pobierać tą ścieżkę
"Katalog1\Katalog2" to nie jest String, nie odczytasz tego funkcją zwracającą String. Musisz czytać znak po znaku i jak trafisz na '', '/' lub dwa znaki '' po sobie, to zamieniać na File.separator.
BTW, napisałem na własne potrzeby program, który na starcie odczytuje parametry z pliku tekstowego za pomocą metody Properties.load(new FileInputstream("bleble.ble")), jednym z parametrów jest katalog. Jak w celach testowych napisałem katalog=babcia\dziadek, to wspomniana metoda odczytała babciadziadek.
a StringTokenizer by nie pomogl?
Wątpię, konstruktory StringTokenizer'a wymagają Stringa.
package test;
import java.io.BufferedReader;
import java.io.FileReader;
public class Test {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new FileReader("file"));
String line = in.readLine();
in.close();
}
}
Plik ktory byl wczytywany:
babcia\dziadek
Program wczytal wszystko poprawnie. Problemem nie jest wczytywanie znaku \ (poza Properties, tam jest jak pisze bogdans).
Poza tym, jesli by bylo tak jak pisze bogdans, pomysl wczytywania znak po znaku i zamiana \ na File.separator nie jest dobry, poniewaz co jesli bedzie sekwencja \b albo \n? Nie bylby to separator sciezki. Ale, wczytywanie nie jest problemem, jak juz mowilem.
Co do pytania w temacie - jaki jest problem z tym kodem?
@malamyga, sprawdziłem i wiem w czym jest problem
line=line.replaceAll("/",File.separator);
rzuca wyjątkiem
baba/dziad
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(Unknown Source)
at java.util.regex.Matcher.appendReplacement(Unknown Source)
at java.util.regex.Matcher.replaceAll(Unknown Source)
at java.lang.String.replaceAll(Unknown Source)
at Test.main(Test.java:20)
zamianę można zrobić tak
line=line.replace("/",File.separator);
String line = "babcia/dziad\\ek";
System.out.println(line); // wynik: babcia/dziad\ek
line = line.replaceAll("[\\\\/]", File.separator);
System.out.println(line); // babcia/dziad\ek // wynik: babcia/dziad/ek
O ile sie domyslilem co to za problem, to teraz powinno dzialac. W kodzie z pierwszego posta bylo nie tak:
malamyga -> dzieki o to chodzilo :)