在可从主Java访问的静态方法内创建数组

在可从主Java访问的静态方法内创建数组,java,arrays,Java,Arrays,这是我尝试在静态方法内创建数组的拙劣尝试。这个程序所做的是列出具有特定扩展名的文档。我希望能够将它们存储在一个数组中,并从main访问该数组。可能吗?这是我目前的代码: package recogniseKeywords; import java.io.File; import java.io.FileInputStream; import java.util.Arrays; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; im

这是我尝试在静态方法内创建数组的拙劣尝试。这个程序所做的是列出具有特定扩展名的文档。我希望能够将它们存储在一个数组中,并从main访问该数组。可能吗?这是我目前的代码:

package recogniseKeywords;

import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;

import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class KeywordsRecognition {

    public static void listFilesForFolder(final File folder) {

        String[] files = {};
        int fileSize = 0;

        String[] extensions = {".doc", ".docm", ".xls"};

        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {

                for(int i=0; i<extensions.length; i++) {
                    //Check if contains one of the extensions and isn't a temporary file(~$)
                    if (fileEntry.getName().contains(extensions[i]) && !fileEntry.getName().startsWith("~$")) {
                        System.out.println(fileEntry.getName());
                        files[fileSize] = fileEntry.getName();
                        fileSize++;
                    }
                }
            }
        }

    }

    public static void main(String[] args) throws Exception {

        String[] keywords = {"Performance Enhancement", "Functional Specification", "Technical Specification", "Faults", "Arval", "Vehicle", "Fines", "Insurance"};


            final File folder = new File("C:/work");
            listFilesForFolder(folder);

            System.out.println(Arrays.toString(files));

        }
    }
}

我知道这是一个静态方法,int和数组没有被视为非静态方法,但是,我不知道如何进一步处理。

我能给你的最好的建议是离开静态领域的魔爪,进入实例领域,这是面向对象的机会之地

在主要方法中,请执行以下操作:

public static void main(String[] args) throws Exception {    
    KeywordsRecognition app = new KeywordsRecognition();
    app.start();
}
然后实现start方法并在那里开始工作。这样做将在代码设计中为您提供更多选项,允许您编写更可读和可测试的代码,从而减少错误和维护问题

要访问ListFileForFolder的结果,可以将其返回、分配给字段或添加到集合。因为您是递归的,所以我会说:将它添加到集合中

理由:每个递归都会添加到同一个集合中。您不希望中间结果对递归以外的代码可见,因此请避免使用字段并使用方法参数。而且,以这种方式通过递归传递数据是很常见的,所以其他开发人员会理解它

private static final String ROOT_FOLDER_DEFAULT = "C:/work";
private static final String[] EXTENSIONS = {".doc", ".docm", ".xls"};
// TODO: the keywords are not used anywhere yet
private static final String[] KEYWORDS = {"Performance Enhancement", "Functional Specification", "Technical Specification", "Faults", "Arval", "Vehicle", "Fines", "Insurance"};

public void start(String rootFolder) {       
    List<String> files = new ArrayList<>();
    readFilesRecursively(new File(rootFolder), files);
    // trick to print list contents by converting to array
    System.out.println(Arrays.toString(files.toArray()));
}        

// recursion is not that common so when you use it, 
// it's a good idea to clearly indicate this in the method name
public void readFilesRecursively(File folder, List<String> files) {
    for (File file : folder.listFiles()) {
        if (file.isDirectory()) {
            readFilesRecursively(file, files);
        } else {
            for(String extension : EXTENSIONS) {
                String fileName = file.getName();
                if (fileName.contains(extension ) && !isTemporaryFile(fileName)) {
                    files.add(fileName);
                }
            }
        }
    }
}

// if you find yourself adding a comment in the middle of your code
// that usually means you need to extract a method for that bit
private boolean isTemporaryFile(String fileName) {
    return fileName.startsWith("~$");
}

public static void main(String[] args) throws Exception {    
    KeywordsRecognition app = new KeywordsRecognition();
    app.start(getRootFolder(args));
}

private static String getRootFolder(String[] args) {
    if(args != null && args.length > 0) {
        return args[0];
    }
     else {
        return ROOT_FOLDER_DEFAULT:
    }
}
main无法在ListFileForFolder中看到files变量的原因是files是一个局部变量。它的作用域是listFilesForFolder方法本身。如果将main和listFilesForFolder声明为实例方法,则仍然是这样

有许多可能的解决办法。最直接的方法是:

将值文件作为ListFileForFolder的结果返回,并在main中使用返回的值

将文件声明为静态变量而不是局部变量

将文件声明为实例变量,然后将代码更改为更面向对象的代码;请参见Adrian的答案以获取示例


在这些方法中,1和3更好。方法2适用于这样一个简单的示例,但在大型应用程序中由于各种原因而存在问题。

为什么不从静态方法返回数组?有两个简单的解决方案:1。返回数组,2。创建一个静态数组,并在调用该方法后访问它。看起来文件没有正确插入到数组中。我已经检查了文件大小是如何递增的,它是1,2,1,2,3…这段代码有效吗?数组在Java中具有固定长度,您应该创建一个附加列表,然后在需要时将其转换为数组,因为您只知道之后的条目数。@dsafasfsa是的,这是另一个问题,您可以递归调用它,文件列表和计数器应该在类级别,而不是在方法内部。有一些错误和改进,但我想我现在完成了。但没有通过编译/运行来检查它。感谢您的接受。Adriaan Koster是否可以从oracle数据库表中获取存储为blob而不是pc上目录的文件?是的,当然可以。在当前代码中不需要递归目录遍历。但这与当前的问题无关。首先,试着自己解决它,如果你陷入困境,问一个新问题,在这个问题中你展示了你的尝试,以及到底出了什么问题。
List<String> values = new ArrayList<>();
values.add("1");
values.add("foo");
values.add("elderberries");
String[] valuesAsArray = values.toArray();
String[] valuesAsArray = new String[3];
values[0] = "1";
values[1] = "foo";
values[2] = "elderberries";