problem z replaceall

0

Witam

Czy wie ktoś jak obejść na windowsie problem z kodem poniżej ?

String tmp = "C:\xx\z.txt";
tmp = tmp.replaceAll( "[/\]+", File.separator );

0

Jaki problem ?
Dlaczego nie tak

String tmp = "C:"+File.separator+"xx"+File.separator+"z.txt";

?

0

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

0

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.

0

Użytkownik wpisuje "ręcznie" Katalog1\Katalog2 do pliku i z tamtąd program ma pobierać tą ścieżkę

0

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

0

a StringTokenizer by nie pomogl?

0

Wątpię, konstruktory StringTokenizer'a wymagają Stringa.

0
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?

0

@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);
0
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:

  1. niepotrzebny kwantyfikator + (chyba powinno zamieniac w stosunku 1 stary znak : 1 nowy znak?)
  2. regexy w Javie dzialaja na stringach, i tez nalezy escapowac w nich znaki , dlatego mamy az 4(!) znaki \ w regexie w celu zaprezentowania pojedynczego znaku z pliku
    Pozdrawiam.
0

malamyga -> dzieki o to chodzilo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1