0

私の論理に問題があり、いくつかの指針をいただければ幸いです。ディレクトリ内のファイルの配列を反復処理し、.txt で終わるファイルを別の配列内に保存しようとすると、コードが Array Out Of Bounds Exception を生成します。

私の問題は、すべてのファイルの配列が txt ファイルの配列よりも大きいことだと思います。これがエラーの最も論理的な理由のようです。問題は、最初のループと比べて 2 番目のループで 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[];
    }

私はこれを必要以上に難しくしていますか?テキスト ファイルのリストを取得し、ファイル内の特定の単語を置き換え、完了したらそれらをすべて 1 つのファイルに結合しようとしています。

ありがとう!

更新しました:

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

この 2 番目のループは、異なる長さを持つ可能性があるover と over のどちらをfor繰り返しているかについて混乱しているようです。特に、 whenが の長さよりも大きくなる可能性がある場合は、おそらく書き込みを行うべきではありません。txtFileslistOfFilestxtFiles[i]itxtFiles

ただし、ほとんどの場合、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);

//再帰的にしたい場合、つまり file_dir のサブディレクトリを検索する場合は true を使用します

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

2 番目の for ループは、すべてのファイルを反復処理します。つまり、i = 0 .. N で、N はファイルの総数です。ただし、テキスト ファイルは、ここの任意の場所にある可能性があります。そのため、テキスト ファイルが 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 に答える
0

あなたはこれを必要以上に難しくしています。

1 回配列を渡してテキスト ファイルの数をカウントし、2 回目に別の配列にテキスト ファイルを追加します。

インターフェイスの実装者はList<E>、配列よりも適切です。その後、その場で要素を追加できます。後で配列が必要な場合。toArrayメソッドはいつでも最後に使用できます。

于 2012-07-02T18:10:42.363 に答える
0

このシナリオをよく見てください -

listOfFiles はサイズ 6 で、最初のループで 5 つの txt ファイルが見つかり、listOfFiles の最後の要素は txt ファイルです。

次に、2 番目のループの最後の反復で、txtFiles[5] = フォルダー + ファイルを実行しようとしています。txtFiles は 0 ~ 4 しかないため、エラーがスローされます。

Louisが言ったように、ArrayListを使用してください。

于 2012-07-02T18:12:59.933 に答える