2012-07-02 86 views
0

我有一個問題與我的邏輯,我將不勝感激一些指針。當我嘗試迭代目錄中的一組文件並將以.txt結尾的文件存儲在另一個數組中時,我的代碼會生成數組越界異常。JAVA - 數組越界錯誤

我想我的問題是,所有文件的數組大於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

這第二for循環似乎感到困惑無論是遍歷txtFiles以上listOfFiles,這可能有不同的長度。尤其是,當i可能大於txtFiles的長度時,您可能不應寫入txtFiles[i]

但是,大多數情況下,如果您只是使用ArrayList,則此代碼會更簡單。

+0

我很感激回覆。我最終按照你的建議使用了ArrayList。我會發布完成的方法爲別人的參考,但我不知道如何使其正確發佈。該工具沒有工作。 – Anthony

+0

我編輯原始帖子,包括我所做的。它適用於我,大多數!我仍然在努力解決爲什麼它只將它處理的最後一個文件保存到新文檔中。 – Anthony

+0

僅供參考,您應該使用泛型與'ArrayList' –

0

你讓事情變得更加困難。

您正在傳遞數組一次以計算有多少文本文件,然後再次將文本文件添加到另一個數組。

List<E>接口的任何實現者都比數組更合適;您可以隨即添加元素。如果你必須之後有一個數組。最後可以始終使用toArray方法。

1

,而不是複雜的問題,你可以做到這一點

使用Apache Commons io列出所有的文件,如果你希望它是遞歸

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

//使用真實的,即要搜索的file_dir

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

讓我知道你是否有問題。

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++; 
     } 
    } 
} 
0

那麼看看這個場景 -

listOfFiles是大小6,第一循環中,您有5個txt文件,並在listOfFiles的最後一個元素是一個txt文件。

然後在第二次循環的最後一次迭代中,您正在嘗試執行txtFiles [5] =文件夾+文件。這會拋出錯誤,因爲txtFiles只有0-4。

像路易斯說的那樣,使用ArrayList。

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"); 
     }   
    }); 
} 
+0

我是新人,對基本原理不甚瞭解。這似乎是一個更簡單的答案,但我不得不弄清楚如何讓文件夾對象成爲我可以迭代的東西。如果我將20個txt文件添加到此文件夾中,我需要該程序搜索每個文件上的每一行並替換某些字符串。然後在替換之後,將每行添加到另一個目錄中的「已完成的手動」文件中,因爲我不想覆蓋原始文件。 – Anthony

+0

該方法將返回一個File對象列表。你可以在循環中閱讀它們。在內部循環中,您可以從外部循環中讀取文件中的行,並將所需結果附加到您打開以供寫入的新文件。讀取/寫入文件的步驟很簡單,可以從oracle和各種其他來源的java教程中獲得。 –

0

你的第二個for循環遍歷所有的文件,這意味着我= 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]); 
     } 
    } 
}