2011-03-04 39 views
0

我想要做的是創建大量的隨機文件,但我完全失去了。下面的代碼只是不起作用,我想知道爲什麼它不起作用,我能做些什麼來解決它。如何創建多個文件,爲每個文件生成一個隨機名稱

import java.io.*; 
import java.util.*; 

public class main { 
    public static void main(String arg[]){ 

     Random rn = new Random(); 
     int randn = 1+rn.nextInt(999999990); 
     String I_S = Integer.toString(randn); 

     Formatter file; 


     try{ 

      for(int i = 0; i < 9999999; i++){ 
       file = new Formatter("%s.txt", I_S); 
      } 
     } 
     catch(Exception ex){ 
     System.err.println("Error"); 
     } 

    } 

}

+4

什麼問題?編譯器錯誤?結果不好?什麼「不起作用」? – McGlone 2011-03-04 16:21:13

+1

'File.createTempFile()'有什麼問題? – skaffman 2011-03-04 16:22:32

+1

當你捕捉到異常'ex'時,你可能應該用*做些什麼*,因爲這將包含失敗的所有細節。雖然在大型應用程序中這不是一個好主意,但現在只要調用'ex.printStackTrace()'就會將異常詳細信息打印到控制檯,從而讓您瞭解問題所在。 – 2011-03-04 16:22:56

回答

1

如何創建多個文件,每個文件生成一個隨機名稱。

你可能想看看File.createTempFile

看你的代碼,你可能要像

Random rn = new Random(); 
String file; 

for (int i = 0; i < 100; i++) 
    file = String.format("%i.txt", 1+rn.nextInt(999999990)); 
2

通過剛剛產生的隨機數,你可能最終創建/覆蓋相同的文件多次。有一個絕對獨特的一套,做這樣的事情:

final int MAX = 9999999; 

    List<Integer> list = new ArrayList<Integer>(); 

    for (int i = 0; i < MAX; i++) { 
     list.add(i); 
    } 

    Collections.shuffle(list); 

    for (int i = 0; i < MAX; i++) { 
     // create files here 
    } 
1

你可能想看看寫更多的東西是這樣的:

void Write() 
{ 
    try { 
     for(int i = 0; i < MAX_FILES; i++) { 
      FileWriter outFile = new FileWriter("C:\File" + i.toString() + ".txt"); 
      PrintWriter out = new PrintWriter(outFile); 

      // Write text to file 
      out.println("This is line 1"); 
      out.println("This is line 2"); 
      out.print("This is line3 part 1, "); 
      out.println("this is line 3 part 2"); 
      out.close(); 
     } 
    } 
      catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
// obviously this requires a import java.io.*; at the top of the class 

來源:http://www.abbeyworkshop.com/howto/java/writeText/index.html

1

我不知道正是你期望的代碼實現,但現在它實際上什麼都不做。

您正在循環多次,每次創建Formatter的實例。這不是一個文件;相反,它是一個知道如何替換字符串中的標記以創建其他字符串的類。

我認爲你對你所調用的構造函數的描述以及整個類的目的感到困惑。構造函數將第一個參數作爲用於輸出的文件的名稱 - 在您的情況下,這將始終爲%s.txt。第二個參數是用於將String編碼到文件的受支持的字符集的名稱。

此代碼總是會失敗,因爲:

  1. I_S變量,例如, 「56437890」 是不是一個有效的編碼(而 「UTF-8」 將是)。因此,構造函數在嘗試編碼編碼方案時可能會引發異常。
  2. 即使字符集奇蹟般地正確,您仍然試圖每次都寫入相同的文件(%s.txt),因此您不會獲得所需的多文件行爲。
    這個字符串甚至可能不是一個有效的文件名,這取決於您的操作系統,所以如果格式化程序試圖創建文件,它將引發異常。
  3. 如果兩個參數都奇蹟般地出現了,你仍然沒有對格式化程序做任何事情,所以它不會有任何東西寫出來,因此可能不會創建任何文件。
  4. 最後,您不會更新循環中的隨機變量(I_S) - 它會設置一次,然後永遠保持相同的值。所以甚至如果所有上述問題都沒有問題,你仍然會一遍又一遍地創建相同的(單個)隨機命名文件。

正如我在評論中指出,失敗的話,你捕捉和吞嚥異常,所以你絕對沒有辦法知道什麼出了問題。

基本上我認爲你對Formatter類的目的感到困惑,因爲我不知道你想達到什麼目的(文件應該是空的?在文件中有特定的文本嗎?)我不能建議一些絕對有效的東西。不過,如果你只是想創建空文件,試試你的循環內是這樣的:

String filename = "%s.txt".format(I_S); 
File file = new File(filename); 
file.createNewFile(); 
// Add some logic to update the random variable here! 

最後一點,adarshr's answer是你站在重複隨機數的非平凡機會完全正確的,所以你贏了」您可以獲得與您期望的一樣多的文件。答案在於描述一種避免這種情況的好方法,值得關注。

+0

謝謝你的快速回復傢伙,非常感謝。 – Andy 2011-03-04 16:53:14

相關問題