2013-07-23 29 views
2

我是Java的新手。我正在處理之前的帖子link如何將數組值作爲輸出返回給Java中的方法

我想返回目錄下的特定擴展名(如.txt)文件名。

爲此,我使用2個參數編寫了以下方法。

public void ListOfFileNames(String directoryPath,String fileType) 
    { 
    //Creating Object for File class 
File fileObject=new File(directoryPath); 
//Fetching all the FileNames under given Path 
File[] listOfFiles=fileObject.listFiles(); 
//Creating another Array for saving fileNames, which are satisfying as far our requirments 
String[] fileNames; 
for (int fileIndex = 0; fileIndex < listOfFiles.length; fileIndex++) 
{ 
    if (listOfFiles[fileIndex].isFile()) 
    { 
     //True condition,Array Index value is File 
     if (listOfFiles[fileIndex].getName().endsWith(fileType)) 
     { 
      //System.out.println(listOfFiles[fileIndex].getName()); 
     } 
    } 
} 

}

在這裏,我面臨兩個問題。

  1. 函數返回類型。

  2. 將文件名添加到fileNames數組中。

我該如何解決這個問題。

謝謝。

回答

1

這是好事,用列表,而不是陣列
改變這樣

public void FileMoving() 
{ 
    //created object for Class 
    ExternalFileExecutions ExternalFileExecutionsObject=new ExternalFileExecutions(); 
    //calling Method from class object 
    List<String> fileNames = ExternalFileExecutionsObject.ListOfFileNames("C:/Documents and Settings/mahesh/Desktop/InputFiles",".txt");  
    //to find out the length of list 
    System.out.println(fileNames.size()); 
} 
public List<String> ListOfFileNames(String directoryPath,String fileType) 
{ 
    //Creating Object for File class 
    File fileObject=new File(directoryPath); 
    //Fetching all the FileNames under given Path 
    File[] listOfFiles=fileObject.listFiles(); 
    //Creating another Array for saving fileNames, which are satisfying as far our requirments 
    List<String> fileNames = new ArrayList<String>(); 
    for (int fileIndex = 0; fileIndex < listOfFiles.length; fileIndex++) 
    { 
     if (listOfFiles[fileIndex].isFile()) 
     { 
      //True condition,Array Index value is File 
      if (listOfFiles[fileIndex].getName().endsWith(fileType)) 
      { 
       //System.out.println(listOfFiles[fileIndex].getName()); 
       fileNames .add(listOfFiles[fileIndex].getName()); 
      } 
     } 
    } 
    return fileNames ; 

    } 
+0

,我只是複製了你的代碼到位我的代碼。它顯示以下錯誤'類型列表不是通用的,它不能用參數參數化 \t '。我該如何解決這個問題 –

+0

@真正的朋友你是什麼導入語句它應該是'import java.util.List;'不是'import java.awt.List;'。 – Prabhaker

+0

再次出現以下錯誤。 'ArrayList無法在行'列表 fileNames = new ArrayList ();' –

0

試試這個:

public List<String> getListOfFileNames(String directoryPath, String fileType) { 
    List<String> result = new ArrayList<String>(); 
    // add the code to loop over the director list and add them to the result 
    return result; 
} 

一個更好的解決辦法是使用的打造成了File類的list()方法。通過它FilenameFilter

http://docs.oracle.com/javase/7/docs/api/

的最好的事情就是重用代碼,而不是再寫一遍。

+0

你能解釋清楚與我的名字。我新的Java端。 –

1

返回類型應爲String[]List<String>您需要將遇到的符合條件的每個文件名放入列表或數組中,並最終返回相同的結果。

在代碼

,這部分如果使用陣列

String[] fileNames; 
int count = 0; 

if (listOfFiles[fileIndex].getName().endsWith(fileType)) 
{ 
    fileNames[count] = listOfFiles[fileIndex].getName(); 
    count++; 
} 

return fileNames; 

代碼的其餘部分保持相同....

如果你想這樣做使用清單

List<String> fileNames = new ArrayList<String>(); 

if (listOfFiles[fileIndex].getName().endsWith(fileType)) 
{ 
    fileNames.add(listOfFiles[fileIndex].getName()); 
} 

return fileNames; 
0

對於返回類型的第一線更改爲

public String[] ListOfFileNames(String directoryPath,String fileType) 

至於陣中增加一個項目,你可能要考慮使用的ArrayList代替。像這樣:

List<String> stringList = new ArrayList<String>(); 
stringList.add("string") 
0
public List<String> ListOfFileNames(String directoryPath, String fileType) { 
    //Creating Object for File class 
    File fileObject = new File(directoryPath); 

    //Fetching all the FileNames under given Path 
    File[] listOfFiles = fileObject.listFiles(); 

    //Creating another Array for saving fileNames, which are satisfying as far our requirments  
    List<String> fileNames = new ArrayList<String>(); 
    for (int fileIndex = 0; fileIndex < listOfFiles.length; fileIndex++) { 
     if (listOfFiles[fileIndex].isFile()) { 
      //True condition,Array Index value is File 
      if (listOfFiles[fileIndex].getName().endsWith(fileType)) { 
       //System.out.println(listOfFiles[fileIndex].getName()); 
       fileNames.add(listOfFiles[fileIndex].getName()); 
      } 
     } 
    } 
    return fileNames; 
} 
0

你想從你的方法返回了幾個String。所以它應該返回一個String []或者一個List<String>,例如。

你也想尊重的Java命名約定,因此該方法應該聲明爲:

public String[] listOfFileNames(String directoryPath, String fileType) 

如果你讀的java.io.File Javadoc中,你會發現,有這正是這麼做的方法。你只需要通過一個FilenameFilter,告訴它應該返回文件名methof:

public String[] listOfFileNames(String directoryPath, final String fileType) { 
    return new File(directoryPath).list(new FilenameFilter() { 
     @Override 
     public boolean accept(File dir, String name) { 
      return name.endsWith(fileType); 
     } 
    }); 
} 

這上面的代碼使用了一個匿名內部類,它實現了的FilenameFilter接口。閱讀Java tutorial瞭解它們。

0

我通常寧願返回File代替String你的代碼。這樣,您不必每次創建新文件就可以使用該文件,並且可以根據需要訪問文件名(例如,.getName()>foo.txt)或整個路徑(getPath()>/dir/foo.txt)。

File已經有一個內置的過濾器功能,無論是在文件StringFileNameFilter)或在File本身(FileFilter)工作。如上所述,我寧願在File上工作。

實施FileFilter非常簡單。

private static class ExtensionFilter implements FileFilter { 
    private final String extension; 

    public ExtensionFilter(String extension) { 
     // store ".TXT" 
     this.extension = "." + extension.toUpperCase(Locale.ROOT); 
    } 

    @Override 
    public boolean accept(File pathname) { 
     // return true if it is a file and it ends with .TXT 
     return pathname.isFile() && pathname.getName().toUpperCase(Locale.ROOT).endsWith(extension); 
    } 
} 

現在添加一些使用這種過濾器的方法,並且您已經完成了很多工作。

// internal method that lists files, converts them into a List and makes sure it does not return null 
private static List<File> listFilesWithExtension(File directory, ExtensionFilter filter) { 
    File[] files = directory.listFiles(filter); 
    return files != null ? Arrays.asList(files) : Collections.<File>emptyList(); 
} 

/** use like listFilesWithExtension(directory, "txt") */  
public static List<File> listFilesWithExtension(File directory, String extension) { 
    return listFilesWithExtension(directory, new ExtensionFilter(extension)); 
} 

/** lists only .txt files */ 
private static final ExtensionFilter TXT_FILES = new ExtensionFilter("txt"); 
public static List<File> listTxtFiles(File directory) { 
    return listFilesWithExtension(directory, TXT_FILES); 
} 

如果你真的想要一個字符串列表/陣列可以通過方法後轉換它像

public static String[] getFileNamesFromFiles(List<File> files) { 
    String[] result = new String[files.size()]; 
    for (int i = 0; i < files.size(); i++) { 
     File file = files.get(i); 
     result[i] = file.getName(); 
    } 
    return result; 
} 
0

您可以使用類似以下內容:

public List<String> ListOfFileNames1(final String directoryPath, 
      final String fileType) { 
     List<String> result = new ArrayList<String>(); 
     // Creating Object for File class 
     File root = new File(directoryPath); 
     for (File f : root.listFiles()) { 
      if (f.isFile() && f.getName().endsWith(fileType)) { 
       result.add(f.getName()); 
      } // if 
     } // for 
     return result; 
    } // ListOfFileNames1 

    public List<File> ListOfFileNames2(final String directoryPath, 
      final String fileType) { 
     // Creating Object for File class 
     File root = new File(directoryPath); 
     return Arrays.asList(root.listFiles(new FileFilter() { 

      @Override 
      public boolean accept(File pathname) { 
       return pathname.isFile() 
         && pathname.getName().endsWith(fileType); 
      } 
     })); 
    } // ListOfFileNames2 
相關問題