2012-08-10 15 views
4

我想要一種方法來生成一個包含Java中隨機位的文件。什麼會創建最快的隨機文件?我想創建包含隨機位的任何指定大小的文件。我希望能夠在幾分鐘內生成一個2GB的文件(如果可能的話,少於一分鐘)。我現在使用的技術需要數個小時做2GB:在Java中創建包含隨機字節的2GB文件的最快方法是什麼?

... 
private static Random r = new Random(); 

private static int rand(int lo, int hi) { 
    int n = hi - lo + 1; 
    int i = r.nextInt() % n; 
    if (i < 0) { 
     i = -i; 
    } 
    return lo + i; 
} 
... 
fos = new FileOutputStream(hdFiller); 
for(long i = 0; i < maxFileSize; i++) { 
    int idx = rand(0,32); 
    fos.write(idx); 
} 
fos.close(); 
... 

有一定是一個更快的方式做到這一點,甚至在小於2GB的一分鐘。

謝謝。

+14

你在哪個平臺上?如果是unix-ish,你最好在命令行執行此操作:'dd if =/dev/urandom of = random.txt bs = 4096 count = 512'(4096 * 512 = 2meg,根據需要調整你的2gig)。 – 2012-08-10 18:16:04

+0

@MarcB美麗! – Eugene 2012-08-10 18:17:49

+1

隨機隨機性如何?隨機性越大,需要的時間越長。爲什麼它需要隨機? – 2012-08-10 21:12:29

回答

6

如果您希望一次生成隨機位而不是循環,請查看java.util.Random method nextBytes(byte[]),它使用隨機字節填充指定的字節數組。爲2GiB數據創建一個足夠大的字節數組,並且可以一次生成整個隨機位源。

+4

不要直接這樣做,因爲你的程序需要2GB的內存,並且很可能因堆內存錯誤而崩潰。而是以較小的塊生成字節數組。 – 2012-08-10 18:27:31

+0

稍微小些的塊可能會更好,並使用'java.nio' FileChannel編寫,可能作爲MemoryMappedFile([Thinking in Java Memory-mapped files tutorial](http://www.linuxtopia.org/online_books/programming_books /thinking_in_java/TIJ314_029.htm)) – 2012-08-10 18:28:12

+0

對於只訪問一次文件位置的情況,內存映射文件可能不會提供太多優勢,並且可能導致過多的MMU工作。頂級性能需要的只是一個直接的字節緩衝區。 – 2012-08-10 18:55:41

3

嘗試用BufferedOutputStream包裝FileOutputStream。

相關問題