String kann nicht zu Pfad konvertiert werden

kodela

Bekanntes Mitglied
Hallo,

vor langer Zeit habe ich ein Klasse geschrieben, die über einen FileReader per BufferedReader eine Textdatei zeilenweise einliest. Danach wird Zeile für Zeile ausgewertet. Tritt in einer Zeile eine besondere Situation ein, wird sie mit entsprechenden Infos an eine vor der Auswertung bereits per FileWriter und BufferedWriter erstellte Textdatei ausgegeben. Dies funktioniert bestens.

Nun kam ich auf den Einfall, die erstellte Datei in den Fällen, in denen die mit dem FileWriter erstellte Datei ohne Eintrag bleibt, nach der Auswertung aller eingelesenen Zeilen zu löschen. Das will mir nun nicht gelingen, irgendwie stehe ich auf dem Schlauch. Dazu hier der Code, bei dem das Problem auftritt:

Java:
if (!eintrag) {
  Path tempFile = Files.createTempFile(
             aktPfad.substring(0, aktPfad.lastIndexOf("\\")+1) + "bug.txt");
  Files.delete(tempFile);
}

Der Debugger von NetBeans meldet mir:
Fehler: inkompatibler Typ - String kann nicht zu Pfad konvertiert werden
obwohl laut Debugger für
Code:
aktPfad.substring(0, aktPfad.lastIndexOf("\\")+1) + "bug.txt"
folgender String gebildet wird:
Code:
(java.lang.String) "D:\test\bug.txt"

Dies ist korrekt der genaue Pfad, in dem diese Datei erzeugt wurde.

Die hier genannten Bezeichner sind vereinfacht. entsprechen jedoch zu 100% dem tatsächlichen Code.

Warum ist die Konvertierung zu einem Pfad nicht möglich?

Gruß, kodela
 

KonradN

Super-Moderator
Mitarbeiter
Die Meldung kommt so wie Du die angegeben hast? Das wäre extrem lustig, da dort die Klasse auch übersetzt worden wäre.

Der Fehler besagt, dass Du einen String an einer Stelle angegeben hast, in der ein Path erwartet wird.

Aber generell frage ich mich, was Du da genau aufrufen willst. Files.createTempFile gibt es nur zwei Methoden, die alle mehr als ein Parameter benötigen. Das kann also so nicht übersetzen.

Bei so Problemen rate ich immer dazu, einfach einmal die Dokumentation anzusehen - also in dem Fall wäre das jetzt
 

Jw456

Top Contributor
Mit substring wirst du sicherlich nur den Path String ohne Slash bekommen.
Wenn du mit + "bug.txt" den Dateinamen anhängen willst. Solltest du auch den Slash im String mit einfügen.

Edit
Ok ich habe das Plus 1 übersehen.
 
Zuletzt bearbeitet:
Ich würde gleich das Pfad Objekt verwenden. Das macht das Manipulieren von Pfaden einfacher und ist unabhängig von dem Filesystem in dem man arbeitet, z.B Windows, Linux oder ZIP.
Java:
Path aktPfad = Paths.get("d:\\test\\input.txt");
        
        Path pathParent = aktPfad.getParent(); //Parent Verzeichnis ermitteln
        //Falls Parent == null ->  tempPath ist Dateiname; sonst nehme pathParent und hänge Dateiname an.
        Path tempPath = pathParent == null ? Paths.get("bug.txt") : pathParent.resolve("bug.txt");
        Path tempFile = null;
        
                try {
            tempFile = Files.createFile(tempPath);
        } catch (IOException e) {
            // normal handling of IOExceptions
            e.printStackTrace();
        }
Files.createTempFile ist für Dateien im Temp-Bereich vorgesehen. Ich würde die Datei eher normal erzeugen. Mit createTempFile müsste es dann so aussehen:
Code:
tempFile = Files.createTempFile(tempPath, "bug", "txt");
 
Kleiner Nachtrag: Natürlich sollte man von Anfang mit Pahts arbeiten:
Nicht
Code:
Path aktPfad = Paths.get("d:\\test\\input.txt");
Path aktPfad = Paths.get("d:\\test\\input.txt");
sondern:
Code:
Path aktPfad = Paths.get("d:", "test", "input.txt");
 

kodela

Bekanntes Mitglied
Ein großes Danke Euch allen!

Eine solche Resonanz habe ich nicht erwartet. Ich habe mich ziemlich ungeschickt angestellt und bin jetzt dank Eurer Ratschläge um einiges klüger. Die Lösung sieht jetzt so aus, wie von Michael Schusser empfohlen:

Java:
if (!eintrag) {
    String sTemp = aktPfad.substring(0, aktPfad.lastIndexOf(File.separator));
    Path outputPfad = Paths.get(sTemp, "bug.txt");
    Files.delete(outputPfad);
}

Gruß und nochmals vielen Dank
kodela
 

kodela

Bekanntes Mitglied
Eine Frage hätte ich noch in diesem Zusammenhang:
Den Code der Klasse, um den es hier ging, habe ich vor fast genau fünf Jahren geschrieben und es gab damit nie ein Problem. Als ich mich heute wieder mit diesem Code beschäftigte fiel mir etwas auf:

Es wird eine Datei für den Input geöffnet, hier der Code:

Java:
try (FileReader fr = new FileReader(pfad);
    BufferedReader br = new BufferedReader(fr)) {
    do {
         . . .
    } while (zeile != null);
    br.close();
    fr.close();
}

Hier wird in "pfad" der komplette Pfad (als String) für die zu öffnende Datei übergeben.

Zuvor wird allerdings die Datei geöffnet, um deren Entfernung es in diesem Thread ging und zwar mit folgendem Code:

Code:
fw = new FileWriter("unberuecksichtigt.txt");
bw = new BufferedWriter(fw);

Hier wird nur der Dateiname, nicht der komplette Pfad verwendet. Erzeugt wird diese Datei jedoch im selben Ordner, wie die vorgenannte Datei für den Input. Wenn ich diese Datei allerdings lösche, muss der vollständige Pfad angegeben werden.

Warum wird die Output-Datei ohne komplette Pfadangabe im richtigen Ordner, dem Arbeitsordner der Anwendung, erzeugt, in dem auch die Input-Datei liegt?
 

kodela

Bekanntes Mitglied
Ja, danke, das ist tatsächlich so und ich kann daher meinen Code an einigen Stellen vereinfachen. Im diskutierten Beispiel sieht das dann so aus:

Java:
if (!eintrag) {
    Path outputPfad = Paths.get("bug.txt");
    Files.delete(outputPfad);
}

oder noch kürzer:

Java:
if (!eintrag) {
    Files.delete(Paths.get("bug.txt");
}

Für den Input gilt dies bei mir nicht, der kann ja von irgendwo stammen.
 
Zuletzt bearbeitet:

Neumi5694

Top Contributor
Versuche grundsätzlich, keine Dateien in deinem Ausführungsverzeichnis zu verändern.
Sollte dein Programm irgend wann nämölich mal z.B. aus "c:\Program Files" ausgeführt werden, kriegst du damit ein Problem. Dann werden Administratorrechte fällig, da nur der Admin da reinschreiben darf.

Sofern möglich, arbeite immer in den dafür vorgesehen Verzeichnissen. Auf einem Windows-System hol dir den Inhalt der Systemvariablen
%appdata% und %localappdata%. Diese verweisen im Normalfall auf "%userprofile%\AppData\Roaming" und "%userprofile%\AppData\Local"
Auf älteren Windows Systeme gibt es nur eine Variable, "Roaming" und "Local" fallen weg.
Unter Linux oder Mac gibt's auch entsprechende Variablen.

Erstelle dann dort entsprechend den Konventionen eine Verzeichnis zum Arbeiten, z.B.
%appdatalocal%/org/thisisme/MeinProgrammName

Das mit der Temp-Datei hast du schon mal gut gemacht, viele würden auch hier eine Datei im Programmverzeichnis anlegen.
 

KonradN

Super-Moderator
Mitarbeiter
Das mit der Temp-Datei hast du schon mal gut gemacht, viele würden auch hier eine Datei im Programmverzeichnis anlegen.
Wobei er da vermutlich das Problem nicht gelöst bekommen hat. Zumindest ich sehe nicht, dass er da die Parameterliste irgendwie angepasst hat. Und der Versuch, bei einem temporären File Pfad/Dateiname anzugeben, ist auch nicht wirklich zielführend. Die Dokumentation beschreibt die Parameter ja richtig und da sind halt zwei Varianten vorhanden:
Mit mind. 3 Parametern:
  • Verzeichnis (Path)
  • Praefix (String)
  • Suffix (String)
  • Möglichkeit für Attribute (varargs Parameter).

Oder ohne den Path - dann wäre es nur:
  • Praefix (String)
  • Suffix (String)
  • Möglichkeit für Attribute (varargs Parameter).

Letzteres würde ich verwenden - dann landet das Temporäre File an dem für das System üblichen Ort.
 

Neumi5694

Top Contributor
Wobei er da vermutlich das Problem nicht gelöst bekommen hat. Zumindest ich sehe nicht, dass er da die Parameterliste irgendwie angepasst hat.
Ich meite rein die Idee, von Java eine Temporärdatei erstellen zu lassen :) Über die Umsetzung lässt sich diskutieren.
Klar, er hat das noch nicht ganz verstanden und sollte sich wirklich mal die API Doku durchlesen, aber der reine Fakt, dass er es versucht hat, ist schon mehr, als andere zu bieten haben.

edit: Ja, die zweite Methode ist die, die ich empfehlen würde und auch verwende, wenn ich was brauche.
 

kodela

Bekanntes Mitglied
Versuche grundsätzlich, keine Dateien in deinem Ausführungsverzeichnis zu verändern.
Sollte dein Programm irgend wann nämölich mal z.B. aus "c:\Program Files" ausgeführt werden, kriegst du damit ein Problem. Dann werden Administratorrechte fällig, da nur der Admin da reinschreiben darf.

Sofern möglich, arbeite immer in den dafür vorgesehen Verzeichnissen. Auf einem Windows-System hol dir den Inhalt der Systemvariablen
%appdata% und %localappdata%. Diese verweisen im Normalfall auf "%userprofile%\AppData\Roaming" und "%userprofile%\AppData\Local"
Auf älteren Windows Systeme gibt es nur eine Variable, "Roaming" und "Local" fallen weg.
Unter Linux oder Mac gibt's auch entsprechende Variablen.

Erstelle dann dort entsprechend den Konventionen eine Verzeichnis zum Arbeiten, z.B.
%appdatalocal%/org/thisisme/MeinProgrammName

Das mit der Temp-Datei hast du schon mal gut gemacht, viele würden auch hier eine Datei im Programmverzeichnis anlegen.

Danke für die wertvollen Hinweise von Dir und auch von @KonradN. Ich werde mich vor allem für eventuell künftige Projekte sicher an sie erinnern.
Mein derzeitiges Projekt ist nach ziemlich genau fünf Jahren so gut wie abgeschlossen. Da werde ich wohl nicht mehr viel ändern.

Gruß, kodela
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
D Java Error String kann nicht in Int umgewandelt werden Allgemeine Java-Themen 2
A Kann String nicht vergleichen (Android) Allgemeine Java-Themen 4
D Name eines Nicht-String Objekts ausgeben Allgemeine Java-Themen 4
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K String.replace funktioniert nicht Allgemeine Java-Themen 3
P Absatz im String / Excel / /n geht nicht Allgemeine Java-Themen 2
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
V String nicht im String literal pool speichern - Parser Allgemeine Java-Themen 30
A String.split() funktioniert nicht richtig Allgemeine Java-Themen 4
Airwolf89 ReplaceAll, kann xml- Tag nicht aus String ausschneiden Allgemeine Java-Themen 3
G konstanter String[] laesst sich nicht in Annotation nutzen Allgemeine Java-Themen 2
M Übergebener String bearbeiten geht nicht. Allgemeine Java-Themen 4
Y PropertyMap: Zugriff über konkatenierten String klappt nicht Allgemeine Java-Themen 7
J MD5-Prüfsumme von ein und demselben String nicht gleich Allgemeine Java-Themen 3
O String NICHT vergleich Allgemeine Java-Themen 7
m@nu int zu Hex, aber nicht als String Allgemeine Java-Themen 4
P ReplaceAll ersetzt nicht bzw. möchte verketteten string Allgemeine Java-Themen 4
S [Base64] Encoding von String nicht korrekt Allgemeine Java-Themen 5
P String.split will nicht Allgemeine Java-Themen 3
V String[] wird nicht als Rückgabetyp vom Compiler akzeptiert! Allgemeine Java-Themen 6
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
M String Allgemeine Java-Themen 10
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
O String in Long Hexerdezimal umwandel Allgemeine Java-Themen 14
N String vergleichen. Allgemeine Java-Themen 27
SaschaMeyer Arbeitet String.split falsch? Allgemeine Java-Themen 4
M Switches ohne String Allgemeine Java-Themen 18
AmsananKING String Iteration Allgemeine Java-Themen 5
S Shuffle String aus if-clause Allgemeine Java-Themen 11
Besset Variablen Ist String = "" + int inordnung? Allgemeine Java-Themen 6
M Map <Long, String> zu Map<String, Long> Allgemeine Java-Themen 9
S String Encoding Verständnisproblem Allgemeine Java-Themen 22
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
SaftigMelo Bug Fixen von String-spliten Allgemeine Java-Themen 8
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
YohnsonM String - Aufteilung und Nutzung einzelner Chars Allgemeine Java-Themen 7
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
S String umbenennen: wie? Allgemeine Java-Themen 4
x46 String Format Fehler Allgemeine Java-Themen 2
S ISO 8601 -> getter / setter String Allgemeine Java-Themen 3
L String zu repräsentativen Wert Allgemeine Java-Themen 0
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
L regex ganzer string? Allgemeine Java-Themen 2
L Ist ein string ein erlaubter variabel name? Allgemeine Java-Themen 2
Z JNA Cpp-DLL String Verwendung Allgemeine Java-Themen 2
A String auf Zahlen überprüfen Allgemeine Java-Themen 5
N String Array Eingabe Allgemeine Java-Themen 6
MiMa Datum von String zu LocalDateTime Allgemeine Java-Themen 8
R char aus String entfernen Allgemeine Java-Themen 10
LimDul Mittels Streams aus Strings A B C den String A, B und C machen Allgemeine Java-Themen 12
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Ini Text aus String parsen Allgemeine Java-Themen 1
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
R Variablen String mit split-Funktion aufteilen Allgemeine Java-Themen 7
F Datei in String-Array einlesen Allgemeine Java-Themen 8
S Marker aus String ermitteln Allgemeine Java-Themen 5
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
B Bei Email: FW / AW... - Hilfe bei String suche Allgemeine Java-Themen 21
J String - Vergleiche Allgemeine Java-Themen 7
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
G CSV in String Allgemeine Java-Themen 7
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
D Erste Schritte Fehler mit negativen und 0 Zahlen im String Allgemeine Java-Themen 6
Xge Replace x Zeichen aus String Allgemeine Java-Themen 2
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
F In String 2 Buchstaben vertauschen Allgemeine Java-Themen 2
J Class Decompile als String (Procyon) Allgemeine Java-Themen 2
I Datentypen String in class sicher verwahren Allgemeine Java-Themen 17
J Falls der String ein "X" beinhaltet Allgemeine Java-Themen 2
T String mehrere Worte Allgemeine Java-Themen 2
D String Groß-/Kleinschreibung Allgemeine Java-Themen 2
D String und Klassenvariable Allgemeine Java-Themen 6
Aruetiise Funktion(y = mx+n) in String speichern und berechnen Allgemeine Java-Themen 9
C String in Objektnamen umwandeln Allgemeine Java-Themen 3
E Variablen Aus .txt ausgelesener string mit if() überprüfen? Allgemeine Java-Themen 2
L String-Schema-Aufspaltung Allgemeine Java-Themen 2
E String in Zahl umwandeln, ohne Befehl Integer.parseInt Allgemeine Java-Themen 3
L String splitten und multiplizeren Allgemeine Java-Themen 10
G String mit umbekannter länge splitten. Allgemeine Java-Themen 2
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
A Byte zu String Allgemeine Java-Themen 4
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
T Komplexitätsoptimierung String vergleich Allgemeine Java-Themen 4
heinz ketchup String im JLabel ausgeben und erneuern Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben