JAVA-数组越界错误

JAVA-数组越界错误,java,arrays,file,exception,text,Java,Arrays,File,Exception,Text,我对我的逻辑有疑问,我希望有一些建议。当我尝试遍历目录中的文件数组并将以.txt结尾的文件存储在另一个数组中时,我的代码会生成数组越界异常 我认为我的问题是所有文件的数组都比txt文件的数组大,这似乎是导致错误的最合乎逻辑的原因。问题是我不知道为什么它在第二个循环中比第一个循环中发现更多的txt文件 代码如下: public static void ListFiles(String file_dir) { String files; int txtCounter

我对我的逻辑有疑问,我希望有一些建议。当我尝试遍历目录中的文件数组并将以.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[];
    }
公共静态无效列表文件(字符串文件\u dir){
字符串文件;
int txtCounter=0;
文件夹=新文件(文件目录);
File[]listOfFiles=folder.listFiles();
//统计所有txt文件
对于(int y=0;y
我是不是让事情变得更难了?我试图获取一个文本文件列表,替换文件中的某些单词,并在完成后将它们全部合并到一个文件中

谢谢

更新:

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;
}
publicstaticstring[]ListManualSections(字符串文件\u dir){
文件目录=文件目录+“\\manualSections\\”;
字符串文件;
//创建manualSections目录中所有文件的列表。
文件夹=新文件(文件目录);
File[]listOfFiles=folder.listFiles();
//文本文件的动态列表
ArrayList al=新的ArrayList();
//将文本文件的每个引用添加到ArrayList
for(int i=0;i
第二个
for
循环似乎对它是在
txtFiles
上迭代还是在
listOfFiles
上迭代感到困惑,后者可能具有不同的长度。特别是,当
i
可能大于
txtFiles
的长度时,您可能不应该写入
txtFiles[i]


不过,如果只使用
ArrayList

,那么这段代码通常会更简单,因为这样做比必须做的更难

您将通过一次数组来计算有多少个文本文件,然后第二次将文本文件添加到另一个数组中


接口的任何实现者都比数组更合适;然后可以动态添加元素。如果以后必须有一个数组。您可以始终在最后使用
toArray
方法。

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

用于列出所有文件

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

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

除了@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++;
        }
    }
}
int txtidx=0;
for(int i=0;i
我们来看看这个场景-

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

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


正如Louis所说,使用ArrayList。

您可以简单地使用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");
        }           
    });
}

第二个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]);
        }
    }
}
String txtFiles[]=新字符串[txtCounter];
int txtIndex=0;
for(int i=0;i
感谢您的回复。我最终按照你的建议使用了ArrayList。我会发布完成的方法供他人参考,但我不知道如何正确发布。“'不起作用。我编辑了原始帖子以包含我所做的。这对我来说最有效!我仍在试图弄明白为什么它只保存它处理的最后一个文件
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]);
        }
    }
}