2014-09-29 67 views
2

我試圖打印可用目錄列表時出現了一些問題。 這裏是我的代碼註釋:打印文件列表

File f = new File(System.getProperty("user.home")); 
System.out.println(f.list().toString()); //the output here is absolutely incorrect 

這是輸出

[Ljava.lang.String;@1540e19d 
+1

請爲我們定義「絕對不正確」。 – 2014-09-29 10:06:14

+0

好的。它是[Ljava.lang.String; @ 1540e19d – 2014-09-29 10:06:52

+1

您正在獲取一個String數組。迭代該數組,或者使用'System.out.println(java.util.Arrays.toString(f.list()));' – 2014-09-29 10:07:45

回答

1

要查找的目錄,你需要過濾列表。 listFiles()是一個更好的方法,因爲它返回File對象列表而不是String,這最終會更強大,並允許測試如果「file」是一個我相信你正在嘗試執行的目錄的測試。

File home = new File(System.getProperty("user.home")); 

for (File file : home.listFiles()) { 
    if (file.isDirectory()) { 
     System.out.println(file); 
    } 
} 

或者您可以使用listFiles(一的FileFilter),這將返回文件的基本數組,你可以換到一個列表與Arrays.asList

List<File> directories = Arrays.asList(home.listFiles(new FileFilter() { 

    @Override 
    public boolean accept(File pathname) { 
     return pathname.isDirectory(); 
    } 
})); 

關於的問題「不正確的」輸出[Ljava.lang.String; @ 1540e19d,這對於打印出原始數組是非常正常的,與通常具有很好的toString()實現的集合類型不同。您可以使用實用程序方法java.util.Arrays.toString「漂亮地打印」每個元素。

如果您需要遞歸列表,我會考慮使用更新的java.nio.Files.walk()功能,而不是編寫自己的遞歸方法。

List<Path> paths = Files.walk(home.toPath()).filter(new Predicate<Path>() { 
      @Override 
      public boolean test(Path path) { 
       return path.toFile().isDirectory(); 
      } 
     }).collect(Collectors.toList()); 

或者更簡潔地與Java 8關閉。

List<Path> paths = Files.walk(home.toPath()).filter((path) -> path.toFile().isDirectory()).collect(Collectors.toList()); 
+0

這一堆的最佳答案。 1+ – 2014-09-29 11:08:26

0

這個LL打印文件數以及列表在當前目錄下的文件:

File f = new File(System.getProperty("user.home")); 
System.out.println(f.list().length); 

for (String fileName : f.list()) { 
    System.out.println(fileName); 
} 

如果您想用subdirectory列出文件,然後輸入:

public void listFiles(String path) { 

     File root = new File(path); 
     File[] list = root.listFiles(); 

     for (File f : list) { 
      if (f.isDirectory()) { // check that if current instance is file or directory 
       listFiles(f.getAbsolutePath()); 
       System.out.println("Dir:" + f.getAbsoluteFile()); 
      } 
      else { 
       System.out.println("File:" + f.getAbsoluteFile()); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Test t = new Test(); 
     fw.listFiles("c:\\"); 
    } 
4

您的輸出[Ljava.lang.String; @ 1540e19d是任何String數組的典型toString()輸出。 [意味着數組。然後你會看到String的類名,然後是數組的哈希碼。您正在獲取String數組。通過陣列中的迭代for循環

for (String fileName : f.list()) { 
    System.out.println(fileName); 
} 

System.out.println(java.util.Arrays.toString(f.list())); 

的關鍵是使用File API,因爲它會告訴你什麼是File#list()將返回,這裏的打印出來字符串數組。

+0

謝謝=)這是有效的。 – 2014-09-29 10:10:03

+0

@MaximGotovchits:關鍵是使用API​​,因爲它會告訴你什麼'File#list()'將返回,這裏是一個String數組。 – 2014-09-29 10:10:46

+0

好的,如你所願=) – 2014-09-29 14:44:01

0

做它或者您可以使用java.util.Arrays通過f.list()返回String array轉換爲字符串作爲這樣

File f = new File(System.getProperty("user.home")); 
    String tok[]=f.list(); 
    for(String s:tok){ 
     System.out.println(s); 
    } 

Arrays.toString(f.list());