0

我的逻辑有问题,我会很感激一些指示。当我尝试遍历目录中的文件数组并将以 .txt 结尾的文件存储在另一个数组中时,我的代码会产生数组越界异常。

我认为我的问题是所有文件的数组都大于 txt 文件的数组,这似乎是错误的最合乎逻辑的原因。问题是我不知道为什么它在第二个循环中找到更多的 txt 文件而不是第一个。

这是代码:

public static void ListFiles(String file_dir) {
        String files;
        int txtCounter = 0;

        File folder = new File(file_dir);
        File[] listOfFiles = folder.listFiles(); 

        //Count all txt files
        for (int y = 0; y < listOfFiles.length; y++) {
            if (listOfFiles[y].isFile()) {
                files = listOfFiles[y].getName();
                if (files.endsWith(".txt") || files.endsWith(".TXT")) {
                    txtCounter++;//Add to the count
                }
            }
        }

        //Create array for the list of txt files.
        String txtFiles[] = new String[txtCounter];

        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                files = listOfFiles[i].getName();
                if (files.endsWith(".txt") || files.endsWith(".TXT")) {
                    //Add all txt files to new array txtFiles
                    txtFiles[i] = folder + files;                   
                    System.out.println(txtFiles[i]);
                }
            }
        }

        //Send array back to Main
        //return txtFiles[];
    }

我是否让这变得比它必须的更难?我正在尝试获取文本文件列表,替换文件中的某些单词,并在完成后将它们全部合并到一个文件中。

谢谢!

更新:

public static String[] ListManualSections(String file_dir) {
    file_dir = file_dir + "\\manualSections\\";

    String files;

    //Create list of all files in the manualSections directory.
    File folder = new File(file_dir);
    File[] listOfFiles = folder.listFiles(); 

    //Dynamic list of text files
    ArrayList al = new ArrayList();

    //Add each occurrence of a text file to the ArrayList
    for (int i = 0; i < listOfFiles.length; i++) {
        files = listOfFiles[i].getName();
        if (listOfFiles[i].isFile() && files.toLowerCase().endsWith(".txt")) {
            al.add(folder + "\\" + files);
            //System.out.println(al);
        }
    }

    //Send list back to Main
    String[] txtFiles = (String[]) al.toArray(new String[al.size()]);
    return txtFiles;
}
4

7 回答 7

4

第二个for循环似乎对它是迭代 overtxtFiles还是 over感到困惑listOfFiles,这可能有不同的长度。特别是,您可能不应该写入txtFiles[i]wheni可能大于txtFiles.

不过,大多数情况下,如果您只使用ArrayList.

于 2012-07-02T18:07:11.477 回答
2

除了@Louis 的答案之外,您还可以为文件和 txt 文件使用单独的计数器。像这样:

int txtidx = 0;
for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
        files = listOfFiles[i].getName();
        if (files.endsWith(".txt") || files.endsWith(".TXT")) {
            //Add all txt files to new array txtFiles
            txtFiles[txtidx] = folder + files;                   
            System.out.println(txtFiles[txtidx]);
            txtidx++;
        }
    }
}
于 2012-07-02T18:12:02.253 回答
1

而不是使事情复杂化,你可以这样做

使用Apache Commons io列出所有文件

    Collection<File> files = FileUtils.listFiles(new File("file_dir"), new String[]{"txt"}, true);

//如果你希望它是递归的,使用true,即搜索file_dir的子目录

for (File file : files)
{
    //you can then play with your file object here
}

如果您有问题,请告诉我。

于 2012-07-02T18:10:56.167 回答
0

您可以简单地使用 File.listFiles(FileNameFilter) 来获取符合您条件的文件。

private File[] getTextFiles(String dir)
{
    File folder = new File(dir);

    return folder.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }           
    });
}
于 2012-07-02T18:49:48.777 回答
0

你让这变得比它必须的更难。

您传递一个数组一次以计算有多少文本文件,然后第二次将文本文件添加到另一个数组。

接口的任何实现者List<E>都比数组更合适;然后,您可以即时添加元素。如果你之后必须有一个数组。你总是可以toArray在最后使用该方法。

于 2012-07-02T18:10:42.363 回答
0

那么看看这个场景 -

listOfFiles 的大小为 6,第一次循环找到 5 个 txt 文件,listOfFiles 中的最后一个元素是一个 txt 文件。

然后在第二个循环的最后一次迭代中,您尝试执行 txtFiles[5] = folder+files. 这将引发错误,因为 txtFiles 只有 0-4。

就像 Louis 说的,使用 ArrayList。

于 2012-07-02T18:12:59.933 回答
0

您的第二个 for 循环遍历所有文件,这意味着 i = 0 .. N 其中 N 是文件总数。但是您的文本文件可能出现在任何 i 此处。因此,即使只有 2 个文本文件,如果在 N 个总文件的第 6 次迭代中找到它们,那也不是您要用于文本文件数组的索引。

我建议您为文本文件数组的索引创建一个计数器,并在添加时递增它,或者使用列表。

String txtFiles[] = new String[txtCounter];
int txtIndex = 0;

for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
        files = listOfFiles[i].getName();
        if (files.endsWith(".txt") || files.endsWith(".TXT")) {
            //Add all txt files to new array txtFiles
            txtFiles[txtIndex] = folder + files;
            txtIndex++;                   
            System.out.println(txtFiles[i]);
        }
    }
}
于 2012-07-03T19:53:31.973 回答