<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## [目錄](https://lingcoder.gitee.io/onjava8/#/book/17-Files?id=%e7%9b%ae%e5%bd%95) **Files**工具類包含大部分我們需要的目錄操作和文件操作方法。出于某種原因,它們沒有包含刪除目錄樹相關的方法,因此我們將實現并將其添加到**onjava**庫中。 ~~~ // onjava/RmDir.java package onjava; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.io.IOException; public class RmDir { public static void rmdir(Path dir) throws IOException { Files.walkFileTree(dir, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); } } ~~~ 刪除目錄樹的方法實現依賴于**Files.walkFileTree()\**,"walking" 目錄樹意味著遍歷每個子目錄和文件。*Visitor\* 設計模式提供了一種標準機制來訪問集合中的每個對象,然后你需要提供在每個對象上執行的操作。 此操作的定義取決于實現的 \*\*FileVisitor**的四個抽象方法,包括: ~~~ 1. **preVisitDirectory()**:在訪問目錄中條目之前在目錄上運行。 2. **visitFile()**:運行目錄中的每一個文件。 3. **visitFileFailed()**:調用無法訪問的文件。 4. **postVisitDirectory()**:在訪問目錄中條目之后在目錄上運行,包括所有的子目錄。 ~~~ 為了簡化,**java.nio.file.SimpleFileVisitor**提供了所有方法的默認實現。這樣,在我們的匿名內部類中,我們只需要重寫非標準行為的方法:**visitFile()**和**postVisitDirectory()**實現刪除文件和刪除目錄。兩者都應該返回標志位決定是否繼續訪問(這樣就可以繼續訪問,直到找到所需要的)。 作為探索目錄操作的一部分,現在我們可以有條件地刪除已存在的目錄。在以下例子中,**makeVariant()**接受基本目錄測試,并通過旋轉部件列表生成不同的子目錄路徑。這些旋轉與路徑分隔符**sep**使用**String.join()**貼在一起,然后返回一個**Path**對象。 ~~~ // files/Directories.java import java.util.*; import java.nio.file.*; import onjava.RmDir; public class Directories { static Path test = Paths.get("test"); static String sep = FileSystems.getDefault().getSeparator(); static List<String> parts = Arrays.asList("foo", "bar", "baz", "bag"); static Path makeVariant() { Collections.rotate(parts, 1); return Paths.get("test", String.join(sep, parts)); } static void refreshTestDir() throws Exception { if(Files.exists(test)) RmDir.rmdir(test); if(!Files.exists(test)) Files.createDirectory(test); } public static void main(String[] args) throws Exception { refreshTestDir(); Files.createFile(test.resolve("Hello.txt")); Path variant = makeVariant(); // Throws exception (too many levels): try { Files.createDirectory(variant); } catch(Exception e) { System.out.println("Nope, that doesn't work."); } populateTestDir(); Path tempdir = Files.createTempDirectory(test, "DIR_"); Files.createTempFile(tempdir, "pre", ".non"); Files.newDirectoryStream(test).forEach(System.out::println); System.out.println("*********"); Files.walk(test).forEach(System.out::println); } static void populateTestDir() throws Exception { for(int i = 0; i < parts.size(); i++) { Path variant = makeVariant(); if(!Files.exists(variant)) { Files.createDirectories(variant); Files.copy(Paths.get("Directories.java"), variant.resolve("File.txt")); Files.createTempFile(variant, null, null); } } } } /* 輸出: Nope, that doesn't work. test\bag test\bar test\baz test\DIR_5142667942049986036 test\foo test\Hello.txt ********* test test\bag test\bag\foo test\bag\foo\bar test\bag\foo\bar\baz test\bag\foo\bar\baz\8279660869874696036.tmp test\bag\foo\bar\baz\File.txt test\bar test\bar\baz test\bar\baz\bag test\bar\baz\bag\foo test\bar\baz\bag\foo\1274043134240426261.tmp test\bar\baz\bag\foo\File.txt test\baz test\baz\bag test\baz\bag\foo test\baz\bag\foo\bar test\baz\bag\foo\bar\6130572530014544105.tmp test\baz\bag\foo\bar\File.txt test\DIR_5142667942049986036 test\DIR_5142667942049986036\pre7704286843227113253.non test\foo test\foo\bar test\foo\bar\baz test\foo\bar\baz\bag test\foo\bar\baz\bag\5412864507741775436.tmp test\foo\bar\baz\bag\File.txt test\Hello.txt */ ~~~ 首先,**refreshTestDir()**用于檢測**test**目錄是否已經存在。若存在,則使用我們新工具類**rmdir()**刪除其整個目錄。檢查是否**exists**是多余的,但我想說明一點,因為如果你對于已經存在的目錄調用**createDirectory()**將會拋出異常。**createFile()**使用參數**Path**創建一個空文件;**resolve()**將文件名添加到**test Path**的末尾。 我們嘗試使用**createDirectory()**來創建多級路徑,但是這樣會拋出異常,因為這個方法只能創建單級路徑。我已經將**populateTestDir()**作為一個單獨的方法,因為它將在后面的例子中被重用。對于每一個變量**variant**,我們都能使用**createDirectories()**創建完整的目錄路徑,然后使用此文件的副本以不同的目標名稱填充該終端目錄。然后我們使用**createTempFile()**生成一個臨時文件。 在調用**populateTestDir()**之后,我們在**test**目錄下面創建一個臨時目錄。請注意,**createTempDirectory()**只有名稱的前綴選項。與**createTempFile()**不同,我們再次使用它將臨時文件放入新的臨時目錄中。你可以從輸出中看到,如果未指定后綴,它將默認使用".tmp"作為后綴。 為了展示結果,我們首次使用看起來很有希望的**newDirectoryStream()\*\*,但事實證明這個方法只是返回 \*\*test**目錄內容的 Stream 流,并沒有更多的內容。要獲取目錄樹的全部內容的流,請使用 \*\*Files.walk()\*\*。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看