2

我是新手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数组中。

我怎样才能解决这个问题。

谢谢。

4

8 回答 8

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;
于 2013-07-23T11:28:23.690 回答
1

最好使用 List 而不是数组
像这样更改您的代码

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 ;

  }
于 2013-07-23T11:30:57.933 回答
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;
}

一个更好的解决方案是使用list()内置到File类中的方法。传一个FilenameFilter.

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

最好的办法是重用代码而不是重新编写它。

于 2013-07-23T11:27:30.960 回答
0

对于返回类型,将您的第一行更改为

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

至于在数组中添加项目,您可能需要考虑使用 ArrayList 代替。像这样:

List<String> stringList = new ArrayList<String>();
stringList.add("string")
于 2013-07-23T11:28:58.450 回答
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;
}
于 2013-07-23T11:30:25.550 回答
0

你想从你的方法中返回几个字符串。例如,它应该返回一个 String[] 或 a List<String>

您还希望尊重 Java 命名约定,因此该方法应声明为:

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

如果您阅读 的 javadoc java.io.File,您会注意到有一个方法可以做到这一点。你只需要传递一个FilenameFilter,它告诉方法应该返回哪些文件名:

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 教程以了解它们。

于 2013-07-23T11:30:55.000 回答
0

我通常更愿意返回 aFile而不是 a String。这样您就不必在每次想要使用它时都创建一个新文件,并且您可以根据需要访问例如文件名 ( .getName()> foo.txt) 或整个路径 ( getPath()> /dir/foo.txt)。

File已经有一个内置的过滤器功能,可以作为String( FileNameFilter)处理文件,也可以处理文件File本身 ( FileFilter)。如上所述,我更喜欢在File.

实现 aFileFilter非常简单。

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;
}
于 2013-07-23T12:00:39.387 回答
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
于 2013-07-23T12:08:43.470 回答