Mit neueren Java-Versionen geht das ganz einfach so:

import java.util.concurrent.ThreadLocalRandom;
...
int dicedNumber = ThreadLocalRandom.current().nextInt(1, 7);

Erzeugt eine Zufallszahl zwischen 1 und 6.

...zur Antwort

Ist vollkommen okay!

Der Return-Wert von setTimeout() ist die Timer-ID. Mit dieser kannst du verschiedene Timer unterscheiden.

Mit clearTimeout() und der ID könntest du den Timer stoppen, bevor er abläuft.

...zur Antwort

In deinem Beispiel ist es ein Array von chars. Ein Array von char pointern sieht so aus:

char string[] = "abc";
char *pointer[] = {&string[0], &string[1], &string[2]};
*pointer[0] = 'x';
*pointer[1] = 'y';
*pointer[2] = 'z';
printf("%s\n", string);
// xyz

Jeder Eintrag im pointer-Array zeigt auf einen Eintrag im string-Array. Über Dereferenzierung von pointer können so die Daten in string geschrieben oder gelesen werden.

...zur Antwort

Ein InputStreamReader liest Bytes von einem InputStream (File, String,...) und dekodiert sie in ein bestimmtes Charset (UTF-8, ASCII).

Den BufferedReader kann man als Wrapper rund um den InputStreamReader verwenden. Bei einem read() kommen die Bytes dann nicht direkt vom Stream (was beim Lesen aus einem File sehr aufwändig sei kann) sondern aus dem Buffer des BufferedReaders. Das ist viel effizienter.

...zur Antwort