Java: Eine Datei mit zufälligem Inhalt erzeugen
Aus aktuellem Anlass habe ich mir ein kleines Tool geschrieben, welches eine Datei mit zufälligem Inhalt erzeugen kann.
Das Problem dabei ist, dass die Anwendung schnell an ihre Grenzen im Hauptspeicher stößt und abbricht. Das ist dadurch zu lösen, indem man die Daten stückweise erzeugt und schreibt. Auf diese Weise benutze ich weniger RAM, iteriere aber das Schreiben der zufälligen Daten umso mehr.
Dabei werden die Iterationen anhand der gegebenen Einheit bestimmt und die Größe der auf einmal erzeugten Daten anhand des angegeben Größenwertes. Diese Methode ist sehr einfach und kann noch um einiges optimiert werden. Auch wird dadurch unter Umständen das eigentliche Problem nicht gelöst, da der Benutzer immer noch durch Angabe des Größenwertes (unbeachtet der Einheit) die Nutzung des Speichers beeinflussen kann.
Eine automatische Bestimmung der optimalen Anzahl von Iterationen und der optimalen Größe von auf einmal erzeugten Zufallsbytes würde hier also einerseits die Stabilität der Anwendung garantieren. Die Laufzeit würde sich nicht sehr unterscheiden, da in jedem Falle ungeachtet der Anzahl von Iterationen eine bestimmte Menge von Zufallsbytes erzeugt werden müssen.
/**
* This class is used to create a file with random data.
* @author Sebastian Herbermann
*/
public class FileCreator
{
/**
* Creates a file of the given size at the given place with random data.
* @param file location und name of the file
* @param size size of the file
* @param unit expected unit for the filesize
* @return true if file was created, false if an error occured
*/
public static boolean createRandomFile
( String file, int size, FilesizeUnit unit )
{
int repetitions = 1;
switch (unit)
{
case KiloByte:
repetitions = repetitions * 1024;
break;
case MegaByte:
repetitions = repetitions * 1024 * 1024;
break;
case GigaByte:
repetitions = repetitions * 1024 * 1024 * 1024;
break;
}
try {
FileOutputStream os = new FileOutputStream(file);
Random rnd = new Random();
// create rather few random values to reduce RAM use
while ( repetitions > 0 )
{
byte[] bytes = new byte[ size ];
rnd.nextBytes( bytes );
os.write( bytes );
repetitions --;
}
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public static void main(String args[])
{
// create a 500 MB file named "test.file"
createRandomFile("test.file", 500, FilesizeUnit.MegaByte);
}
}
public enum FilesizeUnit {
Byte, KiloByte, MegaByte, GigaByte
}
Über den Sinn einer solchen Klasse kann jeder selbst entscheiden. Wer seine Festplatte einmal füllen möchte, kann hiermit bestimmt viel anfangen.

