{"id":9401,"date":"2020-01-29T09:00:52","date_gmt":"2020-01-29T08:00:52","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=9401"},"modified":"2024-11-29T16:35:54","modified_gmt":"2024-11-29T15:35:54","slug":"verzeichnisse-listen-dateien-verschieben-kopieren-loeschen","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/verzeichnisse-listen-dateien-verschieben-kopieren-loeschen\/","title":{"rendered":"Dateien verschieben, kopieren und l\u00f6schen (Java Datei Tutorial)"},"content":{"rendered":"\n<p>In den bisherigen Artikeln dieser Reihe ging es um das <a href=\"\/de\/java\/dateien-einfach-schnell-lesen\/\">Lesen von Dateien mit Java<\/a>, das <a href=\"\/de\/java\/dateien-schnell-einfach-schreiben\/\">Schreiben von Dateien<\/a> und die <a href=\"\/de\/java\/dateinamen-verzeichnisnamen-file-path-paths\/\">Konstruktion von Verzeichnis- und Dateipfaden mit den Klassen <code>File<\/code> und <code>Path<\/code><\/a>. Dieser vierte Teil beschreibt die wichtigsten Verzeichnis- und Dateioperation. Folgende Fragen werden beantwortet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wie listet man alle Dateien eines Verzeichnisses auf?<\/li>\n\n\n\n<li>Wie sucht man nach Dateien, auf die bestimmte Kriterien zutreffen, innerhalb eines Verzeichnisbaumes?<\/li>\n\n\n\n<li>Wie findet man das aktuelle Verzeichnis?<\/li>\n\n\n\n<li>Wie findet man das Home-Verzeichnis des Users?<\/li>\n\n\n\n<li>Wie findet man das tempor\u00e4re Verzeichnis, und wie erstellt man eine tempor\u00e4re Datei?<\/li>\n\n\n\n<li>Wie verschiebt man Dateien mit Java?<\/li>\n\n\n\n<li>Wie benennt man eine Datei um?<\/li>\n\n\n\n<li>Wie kopiert man eine Datei?<\/li>\n\n\n\n<li>Wie l\u00f6scht man eine Datei?<\/li>\n\n\n\n<li>Wie erstellt man einen symbolischen Link mit Java?<\/li>\n<\/ul>\n\n\n\n<p>Die Fragen werden anhand der NIO.2 File API beantwortet, die mit dem <a rel=\"noopener\" href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=203\" target=\"_blank\">JSR 203<\/a> in Java 7 eingef\u00fchrt wurde.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"verzeichnisoperationen\">Verzeichnisoperationen<\/h2>\n\n\n\n<p>F\u00fcr die folgenden Verzeichnisoperationen ben\u00f6tigst du ein <code>Path<\/code>-Objekt, welches das Verzeichnis repr\u00e4sentiert. Dieses generierst du beispielsweise \u00fcber die statische Methode <code>Path.of()<\/code> (bzw. vor Java 11 \u00fcber <code>Paths.get()<\/code>).<\/p>\n\n\n\n<p>Ein ausf\u00fchrliches Tutorial zur Konstruktion von Verzeichnispfaden mit <code>Path<\/code>, <code>Paths<\/code> und <code>File<\/code> findest du im <a href=\"\/de\/java\/dateinamen-verzeichnisnamen-file-path-paths\/\">dritten Teil dieser Serie<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"inhalt-eines-verzeichnisses-auflisten-mit-files-list\">Inhalt eines Verzeichnisses auflisten mit Files.list()<\/h3>\n\n\n\n<p>Die einfachste Variante den kompletten Inhalt eines Verzeichnisses aufzulisten, ist die <code>Files.list()<\/code>-Methode. Sie liefert einen Stream von <code>Path<\/code>-Objekten zur\u00fcck, die wir im folgenden Beispiel auf <code>System.out<\/code> ausgeben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"GLSL\" data-shcb-language-slug=\"glsl\"><span><code class=\"hljs language-glsl\">Path currentDir = Path.of(System.getProperty(\"user.home\"));\nFiles.list(currentDir).forEach(System.<span class=\"hljs-keyword\">out<\/span>::println);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">GLSL<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">glsl<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"verzeichnis-rekursiv-durchsuchen-mit-files-list\">Verzeichnis rekursiv durchsuchen mit Files.list()<\/h3>\n\n\n\n<p>Kommen wir zu einem etwas komplexeren Fall. In folgendem Beispiel wollen wir alle regul\u00e4ren Dateien ausgeben, die sich im Home-Verzeichnis oder einem Unterverzeichnis beliebiger Tiefe davon befinden und deren Name mit \"settings\" beginnt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.io.*;\n<span class=\"hljs-keyword\">import<\/span> java.nio.file.*;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FindFilesRecursivelyExample<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    Path currentDir = Path.of(System.getProperty(<span class=\"hljs-string\">\"user.home\"<\/span>));\n    findFileRecursively(currentDir, <span class=\"hljs-string\">\"settings\"<\/span>);\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">findFileRecursively<\/span><span class=\"hljs-params\">(\n        Path currentDir, String fileNamePrefix)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    Files.list(currentDir).forEach(child -&gt; {\n      <span class=\"hljs-keyword\">if<\/span> (Files.isRegularFile(child)\n            &amp;&amp; child.getFileName().toString().startsWith(fileNamePrefix)) {\n        System.out.println(child);\n      }\n\n      <span class=\"hljs-keyword\">if<\/span> (Files.isDirectory(child) ) {\n        <span class=\"hljs-keyword\">try<\/span> {\n          findFileRecursively(child, fileNamePrefix);\n        } <span class=\"hljs-keyword\">catch<\/span> (AccessDeniedException e) {\n          System.out.println(<span class=\"hljs-string\">\"Access denied: \"<\/span> + child);\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n          <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> UncheckedIOException(e);\n        }\n      }\n    });\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mit den Methoden <code>Files.isRegularFile()<\/code> und <code>Files.isDirectory()<\/code> kannst du pr\u00fcfen, ob es sich bei einer Datei um eine regul\u00e4re Datei bzw. ein Verzeichnis handelt. Ein weiterer Typ ist der symbolische Link \u2013 diesen erkennst du mit <code>Files.isSymbolicLink()<\/code>. Es ist auch m\u00f6glich, dass alle drei Methoden <code>false<\/code> zur\u00fcckliefern; in dem Fall ist die Datei vom Typ \"other\" (was das genau sein k\u00f6nnte, ist unspezifiziert).<\/p>\n\n\n\n<p>Im Beispiel oben m\u00fcssen wir innerhalb des Lambdas <code>IOException<\/code> abfangen und mit einer <code>UncheckedIOException<\/code> wrappen, da der <code>forEach<\/code>-Consumer des Streams keine checked Exception werfen darf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"verzeichnis-rekursiv-durchsuchen-mit-files-walk\">Verzeichnis rekursiv durchsuchen mit Files.walk()<\/h3>\n\n\n\n<p>Das vorherige Beispiel l\u00e4sst sich deutlich k\u00fcrzer und eleganter schreiben - mit <code>Files.walk()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">findFileWithWalk<\/span><span class=\"hljs-params\">(Path currentDir, String fileNamePrefix)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n  Files.walk(currentDir).forEach(child -&gt; {\n    <span class=\"hljs-keyword\">if<\/span> (Files.isRegularFile(child)\n          &amp;&amp; child.getFileName().toString().startsWith(fileNamePrefix)) {\n      System.out.println(child);\n    }\n  });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Diese Variante hat jedoch den Nachteil, dass sich eine <code>AccessDeniedException<\/code> nicht, wie zuvor, einzeln abfangen l\u00e4sst. Tritt hier eine solche Exception auf, bricht die gesamte <code>Files.walk()<\/code>-Methode ab. Falls das f\u00fcr deine Anwendung vertretbar ist, ist dieser Weg deutlich sch\u00f6ner als der vorherige.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"verzeichnis-rekursiv-durchsuchen-mit-files-walkfiletree\">Verzeichnis rekursiv durchsuchen mit Files.walkFileTree()<\/h3>\n\n\n\n<p>Eine weitere Variante ist <code>Files.walkFileTree()<\/code>. Diese Methode implementiert das <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Besucher_(Entwurfsmuster)\" target=\"_blank\">Visitor-Pattern<\/a>. Sie \u00fcbergibt jede Datei innerhalb der Verzeichnisstruktur an einen <code>FileVisitor<\/code>, den du der Methode mit \u00fcbergibst. In folgendem Beispiel verwenden wir die Klasse <code>SimpleFileVisitor<\/code>, die alle Methoden von <code>FileVisitor<\/code> implementiert. Wir \u00fcberschreiben lediglich die <code>visitFile()<\/code>-Methode:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">findFileWithWalkFileTree<\/span><span class=\"hljs-params\">(\n      Path currentDir, String fileNamePrefix)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n  Files.walkFileTree(currentDir, <span class=\"hljs-keyword\">new<\/span> SimpleFileVisitor&lt;Path&gt;() {\n    <span class=\"hljs-meta\">@Override<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> FileVisitResult <span class=\"hljs-title\">visitFile<\/span><span class=\"hljs-params\">(Path file, BasicFileAttributes attrs)<\/span>\n          <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n      <span class=\"hljs-keyword\">if<\/span> (Files.isRegularFile(file)\n            &amp;&amp; file.getFileName().toString().startsWith(fileNamePrefix)) {\n        System.out.println(file);\n      }\n      <span class=\"hljs-keyword\">return<\/span> FileVisitResult.CONTINUE;\n    }\n  });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der R\u00fcckgabewert der Methode, <code>FileVisitResult.CONTINUE<\/code>, gibt an, dass <code>walkFileTree()<\/code> den Verzeichnisbaum weiter durchlaufen soll. Alternative R\u00fcckgabewerte w\u00e4ren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>TERMINATE<\/code> - beendet die <code>walkFileTree()<\/code>-Methode.<\/li>\n\n\n\n<li><code>SKIP_SIBLINGS<\/code> - \u00fcberspringt alle weiteren Dateien des aktuellen Verzeichnisses.<\/li>\n\n\n\n<li><code>SKIP_SUBDIR<\/code> - \u00fcberspringt das aktuelle Verzeichnis - dieser R\u00fcckgabewert kann jedoch nicht von <code>visitFile()<\/code> zur\u00fcckgegeben werden, sondern von <code>FileVisitor.preVisitDirectory()<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Auch die <code>walkFileTree()<\/code>-Variante w\u00fcrde im Fall einer <code>AccessDeniedException<\/code> die Bearbeitung komplett abbrechen. Hier gibt es allerdings eine M\u00f6glichkeit das zu verhindern. Dazu musst du zus\u00e4tzlich die Methode <code>FileVisitor.visitFileFailed()<\/code> \u00fcberschreiben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">findFileWithWalkFileTree<\/span><span class=\"hljs-params\">(\n      Path currentDir, String fileNamePrefix)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n  Files.walkFileTree(currentDir, <span class=\"hljs-keyword\">new<\/span> SimpleFileVisitor&lt;Path&gt;() {\n    <span class=\"hljs-meta\">@Override<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> FileVisitResult <span class=\"hljs-title\">visitFile<\/span><span class=\"hljs-params\">(Path file, BasicFileAttributes attrs)<\/span>\n          <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n      <span class=\"hljs-keyword\">if<\/span> (Files.isRegularFile(file)\n            &amp;&amp; file.getFileName().toString().startsWith(fileNamePrefix)) {\n        System.out.println(file);\n      }\n      <span class=\"hljs-keyword\">return<\/span> FileVisitResult.CONTINUE;\n    }\n\n    <span class=\"hljs-meta\">@Override<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> FileVisitResult <span class=\"hljs-title\">visitFileFailed<\/span><span class=\"hljs-params\">(Path file, IOException exc)<\/span>\n          <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n      <span class=\"hljs-keyword\">if<\/span> (exc <span class=\"hljs-keyword\">instanceof<\/span> AccessDeniedException) {\n        System.out.println(<span class=\"hljs-string\">\"Access denied: \"<\/span> + file);\n        <span class=\"hljs-keyword\">return<\/span> FileVisitResult.CONTINUE;\n      } <span class=\"hljs-keyword\">else<\/span> {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">super<\/span>.visitFileFailed(file, exc);\n      }\n    }\n  });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"verzeichnis-durchsuchen-mit-files-find\">Verzeichnis durchsuchen mit Files.find()<\/h3>\n\n\n\n<p>Ein alternativer Ansatz ist die <code>Files.find()<\/code>-Methode. Dieser \u00fcbergibst du als dritten Parameter einen \"Matcher\": das ist eine Funktion, die einen <code>Path<\/code> und <code>BasicFileAttributes<\/code> als Eingabeparameter hat und ein <code>boolean<\/code> zur\u00fcckgibt, welches anzeigt, ob die jeweilge Datei im Ergebnis enthalten sein soll oder nicht.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">findFileWithFind<\/span><span class=\"hljs-params\">(Path currentDir, String fileNamePrefix)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n  Files.find(currentDir, Integer.MAX_VALUE,\n        (path, attributes) -&gt; Files.isRegularFile(path)\n              &amp;&amp; path.getFileName().toString().startsWith(fileNamePrefix))\n        .forEach(System.out::println);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Auch hier w\u00fcrde eine <code>AccessDeniedException<\/code> wieder die gesamte Suche vorzeitig beenden. Mir ist keine M\u00f6glichkeit bekannt, das bei <code>Files.find()<\/code> zu umgehen. Erwartest du also Unterverzeichnisse, auf die der Zugriff verwehrt wird, dann solltest du entweder <code>Files.walkFileTree()<\/code> verwenden und die Methode <code>visitFileFailed()<\/code> \u00fcberschreiben, um die Exception abzufangen. Oder, alternativ, <code>Files.list()<\/code> verwenden und die Rekursion selbst implementieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"spezielle-verzeichnisse-finden\">Spezielle Verzeichnisse finden<\/h3>\n\n\n\n<p>Achtung: Wenn Du eine \u00e4ltere Version als Java 11 benutzt, musst Du in den folgenden Code-Beispielen <code>Path.of()<\/code> durch <code>Paths.get()<\/code> ersetzen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Aktuelles Verzeichnis<\/h4>\n\n\n\n<p>Das aktuelle Verzeichnis findet man \u00fcber die System Property \"user.dir\":<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path currentDir = Path.of(System.getProperty(<span class=\"hljs-string\">\"user.dir\"<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Home-Verzeichnis des Users<\/h4>\n\n\n\n<p> Das Home-Verzeichnis des aktuellen Users findest du \u00fcber die System Property \"user.home\":<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path homeDir = Path.of(System.getProperty(<span class=\"hljs-string\">\"user.home\"<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Tempor\u00e4res Verzeichnis<\/h4>\n\n\n\n<p>Und das tempor\u00e4re Verzeichnis findest du \u00fcber die System Property \"java.io.tmpdir\":<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempDir = Path.of(System.getProperty(<span class=\"hljs-string\">\"java.io.tmpdir\"<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>M\u00f6chtest du eine tempor\u00e4re Datei im tempor\u00e4ren Verzeichnis erstellen, brauchst du hierf\u00fcr nicht zuerst das tempor\u00e4re Verzeichnis auszulesen. Es gibt hierf\u00fcr eine Abk\u00fcrzung. Diese findest Du zu Beginn des folgenden Kapitels \"Dateioperationen\".<\/p>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"1427197203\" src=\"https:\/\/happycoders.kit.com\/1427197203\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"dateioperationen\">Dateioperationen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"eine-temporaere-datei-erstellen\">Eine tempor\u00e4re Datei erstellen<\/h3>\n\n\n\n<p>Nachdem das letzte Kapitel mit dem Auslesen des tempor\u00e4ren Verzeichnisses geendet hat, beginnt dieses mit einem Shortcut, um tempor\u00e4re Dateien anzulegen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempFile = Files.createTempFile(<span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die zwei Parameter sind ein Prefix sowie ein Suffix. Dazwischen wird automatisch eine Zufallszahl eingef\u00fcgt. Wenn ich die Methode wiederholt auf meinem Windows-System ausf\u00fchre und die Variable <code>tempFile<\/code> auf der Konsole ausgebe, erhalte ich folgende Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">tempFile = C:\\Users\\svenw\\AppData\\Local\\Temp\\happycoders-7164892815754554616.tmp\ntempFile = C:\\Users\\svenw\\AppData\\Local\\Temp\\happycoders-3557939636108137420.tmp\ntempFile = C:\\Users\\svenw\\AppData\\Local\\Temp\\happycoders-16515581992479122220.tmp\ntempFile = C:\\Users\\svenw\\AppData\\Local\\Temp\\happycoders-4078166990204004103.tmp<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Unter Linux sieht es so aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">tempFile = \/tmp\/happycoders-6859515894563322081.tmp\ntempFile = \/tmp\/happycoders-3688163816397144832.tmp\ntempFile = \/tmp\/happycoders-2576679508175526427.tmp\ntempFile = \/tmp\/happycoders-8074586277964353976.tmp<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wichtig zu wissen ist, dass <code>createTempFile()<\/code> nicht nur das jeweilige <code>Path<\/code>-Objekt erzeugt, sondern tats\u00e4chlich jeweils eine leere Datei anlegt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-verschiebt-man-eine-datei-in-java\">Wie verschiebt man eine Datei in Java?<\/h3>\n\n\n\n<p>Eine Datei wird mit der Methode <code>Files.move()<\/code> verschoben. Das folgende Beispiel legt eine tempor\u00e4re Datei an und verschiebt diese ins Home-Verzeichnis des angemeldeten Users:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempFile = Files.createTempFile(<span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nPath targetDir = Path.of(System.getProperty(<span class=\"hljs-string\">\"user.home\"<\/span>));\nPath target = targetDir.resolve(tempFile.getFileName());\nFiles.move(tempFile, target);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wichtig ist hierbei, dass der zweite Parameter der <code>move()<\/code>-Methode die Zieldatei repr\u00e4sentiert, nicht das Zielverzeichnis! W\u00fcrde man hier <code>Files.move(tempFile, targetDir)<\/code> aufrufen, w\u00fcrde das zu einer <code>FileAlreadyExistsException<\/code> f\u00fchren. Daher wird im Beispiel mit der <code>resolve()<\/code>-Methode das <code>targetDir<\/code> mit dem Dateinamen der zu kopierenden Datei verkettet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-verschiebt-man-ein-verzeichnis-mitsamt-aller-unterverzeichnisse\">Wie verschiebt man ein Verzeichnis mitsamt aller Unterverzeichnisse?<\/h3>\n\n\n\n<p>Ein Verzeichnis kann genau wie eine Datei verschoben werden. In folgendem Beispiel werden zwei tempor\u00e4re Verzeichnisse angelegt, sowie im ersten Verzeichnis eine Datei. Das erste Verzeichnis wird dann ins zweite verschoben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempDir1 = Files.createTempDirectory(<span class=\"hljs-string\">\"happycoders-\"<\/span>);\nPath tempDir2 = Files.createTempDirectory(<span class=\"hljs-string\">\"happycoders-\"<\/span>);\nPath tempFile = Files.createTempFile(tempDir1, <span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nPath target = tempDir2.resolve(tempDir1.getFileName());\nFiles.move(tempDir1, target);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"datei-umbennenen-mit-java\">Datei umbennenen mit Java<\/h3>\n\n\n\n<p>Letztendlich ist das Umbenennen einer Datei (oder eines Verzeichnisses) ein Spezialfall des Verschiebens, bei dem das Zielverzeichnis dem Quellverzeichnis gleicht und sich lediglich der Dateiname \u00e4ndert. In folgendem Beispiel wird eine tempor\u00e4re Datei nach \"happycoders.tmp\" umbenannt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempFile = Files.createTempFile(<span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nPath target = tempFile.resolveSibling(<span class=\"hljs-string\">\"happycoders.tmp\"<\/span>);\nFiles.move(tempFile, target);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der Aufruf <code>tempFile.resolveSibling(\"happycoders.tmp\")<\/code> ist dabei ein Shortcut f\u00fcr <code>tempFile.getParent().resolve(\"happycoders.tmp\")<\/code>: Aus der Quelldatei wird das Verzeichnis extrahiert und dieses mit dem neuen Dateinamen verkettet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-kopiert-man-eine-datei-in-java\">Wie kopiert man eine Datei in Java?<\/h3>\n\n\n\n<p>Das Kopieren einer Datei funktioniert \u00e4hnlich wie das Umbenennen. Im folgenden Beispiel wird eine tempor\u00e4re Datei ins Home-Verzeichnis kopiert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempFile = Files.createTempFile(<span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nPath targetDir = Path.of(System.getProperty(<span class=\"hljs-string\">\"user.home\"<\/span>));\nPath target = targetDir.resolve(tempFile.getFileName());\nFiles.copy(tempFile, target);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Diese Methode hat einen gro\u00dfen Vorteil gegen\u00fcber Eigenimplementationen mit <code>FileInputStream<\/code> und <code>FileOutputStream<\/code>, wie sie vor Java 7 und der NIO.2 File API n\u00f6tig waren: <code>Files.copy()<\/code> delegiert den Aufruf an betriebssystemspezifische \u2013 und damit jeweils optimierte \u2013 Implementierungen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-loescht-man-eine-datei-in-java\">Wie l\u00f6scht man eine Datei in Java?<\/h3>\n\n\n\n<p>Gel\u00f6scht wird eine Datei (oder ein Verzeichnis) mit <code>Files.delete()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempFile = Files.createTempFile(<span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nFiles.delete(tempFile);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wird <code>Files.delete()<\/code> auf einem Verzeichnis aufgerufen, muss dieses leer sein, ansonsten wird eine <code>DirectoryNotEmptyException<\/code> geworfen. Dies kannst du mit folgendem Code ausprobieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempDir = Files.createTempDirectory(<span class=\"hljs-string\">\"happycoders-\"<\/span>);\nPath tempFile = Files.createTempFile(tempDir, <span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nFiles.delete(tempDir);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier wird ein tempor\u00e4res Verzeichnis angelegt und darin eine tempor\u00e4re Datei. Dann wird versucht das (nicht leere) Verzeichnis zu l\u00f6schen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"symbolischen-link-zu-einer-datei-erstellen\">Symbolischen Link zu einer Datei erstellen<\/h3>\n\n\n\n<p>Einen symbolischen Link kannst du mit der Methode <code>Files.createSymbolicLink()<\/code> erstellen. Achtung: Ziel- und Quelle werden hierbei in umgekerter Reihenfolge \u00fcbergeben wie bei allen vorherigen Methoden: zuerst kommt der Link-Pfad, dann der Pfad der zu verlinkenden Datei. Das folgende Beispiel erzeugt eine tempor\u00e4re Datei und legt dann im Home-Verzeichnis einen symbolischen Link zu der erzeugten Datei an.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Path tempFile = Files.createTempFile(<span class=\"hljs-string\">\"happycoders-\"<\/span>, <span class=\"hljs-string\">\".tmp\"<\/span>);\nPath linkDir = Paths.get(System.getProperty(<span class=\"hljs-string\">\"user.home\"<\/span>));\nPath link = linkDir.resolve(tempFile.getFileName());\nFiles.createSymbolicLink(link, tempFile);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dieses Beispiel funktioniert unter Linux ohne Einschr\u00e4nkungen. Unter Windows ben\u00f6tigt man Admin-Rechte, um symbolische Links zu erstellen. Fehlen diese, wird folgende Exception geworfen: <code>FileSystemException: [link]: A required privilege is not held by the client.<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung-und-ausblick\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p>Dieser vierte Artikel aus der Serie \u00fcber Dateien in Java hat die wichtigsten Verzeichnis- und Dateioperationen vorgestellt.<\/p>\n\n\n\n<p>Im n\u00e4chsten Teil zeige ich dir, <a href=\"\/de\/java\/strukturierte-daten-schreiben-lesen-dataoutputstream-datainputstream\/\">wie du mit <code>DataOutputStream<\/code> und <code>DataInputStream<\/code> strukturierte Daten schreiben und lesen kannst<\/a>.<\/p>\n\n\n\n<p>Im Anschluss kommen wir zu den folgenden fortgeschrittenen Themen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die in Java 1.4 eingef\u00fchrten <a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/\">NIO-Channels und Buffer<\/a>, um insbesondere das Arbeiten mit gro\u00dfen Dateien zu beschleunigen<\/li>\n\n\n\n<li><a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/#Memory-mapped_Files_Wie_man_einen_Teil_einer_Datei_in_den_Speicher_mappt\">Memory-mapped I\/O<\/a> f\u00fcr komfortablen und rasend schnellen Dateizugriff ohne Streams<\/li>\n\n\n\n<li><a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/#File_Locking_Sperren_von_Dateibereichen\">File Locking<\/a>, um parallel \u2013 also aus mehreren Threads oder Prozessen \u2013 konfliktfrei auf dieselben Dateien zuzugreifen<\/li>\n<\/ul>\n\n\n\n<p>Wie immer freue ich mich dar\u00fcber, wenn du den Artikel teilst, oder \u00fcber dein Feedback \u00fcber die Kommentarfunktion. M\u00f6chtest du informiert werden, wenn der n\u00e4chste Teil ver\u00f6ffentlicht wird? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dieser vierte Teil der Reihe beschreibt die wichtigsten Verzeichnis- und Dateioperationen.<\/p>\n<p>Du lernst, wie man Dateien in einem Verzeichnis auflistet, wie man nach Dateien sucht, wie man Dateien verschiebt, umbenennt und kopiert und vieles mehr.<\/p>\n","protected":false},"author":1,"featured_media":34405,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"Dateien verschieben, kopieren und l\u00f6schen (Java Tutorial)","_seopress_titles_desc":"Wie listet man in Java Dateien eines Verzeichnisses auf? Wie verschiebt, kopiert, l\u00f6scht man Dateien? Wie erstellt man symbolische Links?","_seopress_robots_index":"","_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":15383,"_post_count":0,"footnotes":""},"categories":[64],"tags":[166],"class_list":["post-9401","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-dateien"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/01\/moving-copying-deleting-files.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Dieser vierte Teil der Reihe beschreibt die wichtigsten Verzeichnis- und Dateioperationen. Du lernst, wie man Dateien in einem Verzeichnis auflistet, wie man nach Dateien sucht, wie man Dateien verschiebt, umbenennt und kopiert und vieles mehr.","public_identification_id":"426386b71fa54ccea2123245e69eb392","private_identification_id":"40e1c317911c449face8b84282bd6cf2","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=9401"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9401\/revisions"}],"predecessor-version":[{"id":41974,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9401\/revisions\/41974"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34405"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=9401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=9401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=9401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}