JAVA - 数组超出界限错误

时间:2012-07-02 18:05:11

标签: java arrays file exception text

我的逻辑存在问题,我希望得到一些指示。当我尝试遍历目录中的文件数组并将以.txt结尾的文件存储在另一个数组中时,我的代码会生成Array Out Of Bounds Exception。

我认为我的问题是所有文件的数组都大于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;
}

7 个答案:

答案 0 :(得分:4)

第二个for循环似乎对它是否在txtFileslistOfFiles上进行迭代而感到困惑,这可能有不同的长度。特别是,当txtFiles[i]可能大于i的长度时,您可能不应该写信txtFiles

但是,大多数情况下,如果您只使用ArrayList,则此代码会更简单。

答案 1 :(得分: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++;
        }
    }
}

答案 2 :(得分: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
}

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

答案 3 :(得分:0)

你正在努力做到这一点。

你要经过一次数组来计算有多少文本文件,然后第二次将文本文件添加到另一个数组。

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

答案 4 :(得分:0)

看看这个场景 -

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

然后在第二次循环的最后一次迭代中,您尝试执行txtFiles [5] =文件夹+文件。这将抛出错误,因为txtFiles只有0-4。

像路易斯所说,使用ArrayList。

答案 5 :(得分: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");
        }           
    });
}

答案 6 :(得分:0)

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

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

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]);
        }
    }
}